使用 SQL 从数据库视图而不是表中读取

Posted

技术标签:

【中文标题】使用 SQL 从数据库视图而不是表中读取【英文标题】:Read from a database view rather than a table using SQL 【发布时间】:2020-02-20 10:09:44 【问题描述】:

我正在尝试从使用 Python 根据数据库中的其他视图创建的视图中读取数据。

数据库设置:

Redshift-postgres
  dev
    Schemas
      schema_name
        Tables
          table_name
        Views
          view_name

Python 代码:

connection=psycopg2.connect("dbname=dev host=redshift.amazonaws.com port=5439 user=user password=password")

cursor = connection.cursor()
schema = "SELECT count(*) FROM schema_name.table_name;"
schema2 = "SELECT count(*) FROM schema_name.view_name;"
result = pd.read_sql(schema, connection)

当我使用schema 运行代码时,它会从表中返回数据,但是当我尝试运行schema2 时,它不会返回任何内容,也不会提供任何错误消息。该脚本不会停止它只是闲置。

当我试图从视图而不是表中获取数据时,我做错了什么吗?

更新

当我运行 schema2 = "SELECT * FROM INFORMATION_SCHEMA.TABLES;" 时,它确实返回以下内容:

table_catalog    table_schema   table_name  table_type 
dev              schema_name    view_name         VIEW    

它列出了我试图从中读取数据的视图。

我这样创建视图:

CREATE OR REPLACE VIEW schema_name.view_name
AS SELECT *
        CASE
            WHEN statement
            ELSE false
        END AS column_name, 

   FROM schema_name.another_view_name
   LEFT JOIN schema_name.another_view_name_2 data_1 ON data_2 = data_3
   LEFT JOIN schema_name.another_view_name_3 data_4 ON data_5 = data_6

我已将无关数据命名为data_x,我根据某些条件加入了视图。

【问题讨论】:

它不返回整数值,比如 0? schema 返回0 100、索引0 和行数100schema2 不返回任何内容。我在终端中运行这个脚本,在我运行脚本python3 my_script.py 之后它只是空闲。 您确定视图应该返回行吗?我的意思是您知道该视图的创建查询吗?您可以先尝试使用 psql 来查看视图返回的结果吗? 我写了视图,我知道视图包含行,它还能包含哪些其他类型的信息?只是将SELECT 放在VIEW 中,不是吗?或者我无法从创建为SELECT 的视图中检索任何信息?我将在原始问题中添加简化的view_name 代码。 如果您运行用于创建视图(没有CREATE VIEW)部分的实际查询,它是否返回一个值?如果是这样,如果将其包装在 SELECT COUNT(*) 查询中会发生什么? 【参考方案1】:

事实证明,amazon redshift DB 被堵塞了,并且有 5 个查询运行了 4 天而没有任何响应。无论如何,我仍然发现从具有 2 个左连接的视图中读取需要 3 个小时才能阅读,这不是它应该如何工作的。该视图只有 1.2m 行。谢谢你的建议。

【讨论】:

以上是关于使用 SQL 从数据库视图而不是表中读取的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL Server 上创建一个数据库角色,其中该角色的用户只能从一个视图中选择,而不能从视图中使用的表中选择?

sql数据库组成视图的多个表中数据增加,视图怎么不同步变啊,愁死了~亲们帮忙呀~

将 jQuery JSON 对象保存到 SQL 表中,而无需在 MVC ASP.NET Core 中创建视图模型类

mysql视图的作用是啥

MySQL视图

使用存储过程从视图中检索或过滤数据是不是比使用存储过程从表中获取或过滤数据更快?