【发布时间】:2021-02-04 12:47:56
【问题描述】:
您好,我正在尝试使用 SELECT 语句从不同的表中读取数据,并希望最终使用 UNION 来获取一个数据集。一个表可能(还)不包含数据。在这种情况下,我可以成功读取前两个数据集的数据,但是一旦我使用 UNION 将其与空表中的数据结合起来,结果数据集也将为空,即使它之前包含前两个数据集的数据。
我的问题是,数据在这些表之间不规则地移动,所以我无法知道我会在三个表中的哪一个中找到数据,而且在任何情况下,我通常必须将多个表的结果组合到获取我需要的整个数据集(一个包含仅 3 个月前的数据,另外两个包含去年和当前年份的数据 - 取决于我需要数据的时间段,因为我可能必须查看所有三个他们收集我需要的所有数据)。
您知道如何检查所有三个表并读取数据以收集我需要的整个数据集吗? 我还测试了是否一切正常,以防所有三个表都包含数据,等等,它工作了,我检索了我需要的所有数据。所以语句本身应该没问题,只是不适用于一张表不包含数据的特殊情况。
我正在使用 Python 连接数据库并通过 sql 语句检索数据。
所以我的sql语句目前是这样的:
sql_stmt = (
"select " + sql_param+" from " + db_table +
" where datum>=" + season_start_sql + " and datum<" + season_end_sql +
" and statnr="+str(statnr) +
" union" +
" select " + sql_param+" from " + db_table +
" where datum=" + season_end_sql + " and stdmin<=" + season_end_time_sql +
" and statnr="+str(statnr) +
" union" +
" select " + sql_param + " from " + db_table + "_" + str(season_start.year) +
" where datum>=" + season_start_sql + " and datum<" + season_end_sql +
" and statnr=" + str(statnr) +
" union" +
" select " + sql_param + " from " + db_table + "_" + str(season_start.year) +
" where datum=" + season_end_sql + " and stdmin<=" + season_end_time_sql +
" and statnr=" + str(statnr) +
" union" +
" select " + sql_param + " from " + db_table + "_" + str(next_year) +
" where datum>=" + season_start_sql + " and datum<" + season_end_sql +
" and statnr=" + str(statnr) +
" union" +
" select " + sql_param + " from " + db_table + "_" + str(next_year) +
" where datum=" + season_end_sql + " and stdmin<=" + season_end_time_sql +
" and statnr=" + str(statnr) +
" order by datumsec")
【问题讨论】:
-
UNION的两个表中的一个为空也没关系,你仍然会从另一个表中获取数据。
-
我相当怀疑您使用字符串连接将值输入查询会增加一些流氓值,而整个查询实际上会出错。使用参数化查询。您可能还需要修改架构。好像你每年都有一张桌子。不要那样做,所有年份都有一个,并在额外的列中表示年份。为什么
UNION呢?这是出于性能原因吗?因为在WHERE子句中使用OR可以更简单地表达它。 -
好的,谢谢。 Unforutnatley 我无法更改表的架构。我不负责数据库,而只是使用其中的数据。另外,如果我理解正确并且 OR 不会导致数据集包含所有表中的数据......?有可能我需要从他们每个人那里读取数据确实收集了我需要的整个数据集。
-
好的,我忽略了实际上涉及三个表。所以你需要
UNION他们的结果。但是,如果您在WHERE子句中使用OR,则每个表只需要一个查询。 -
您的 DBMS 是什么?也许它有一些可能通过Google BigQuery中的模式查询表。