我在 SQL 中有許多不同的表,它們共享相同的架構,但包含不同的資料。我正在撰寫一個查詢,該查詢在每個表上使用一致的 WHERE 子句,然后將它們全部合并在一起。在寫了其中一些之后,我意識到一次又一次地復制相同的 WHERE 子句開始看起來非常多余,我想知道是否有某種方法可以重寫這個不會重復太多事情的查詢。這是我正在使用的查詢的精簡版本:
SELECT a.primary_key, a.field1, b.field1 AS field2, 'One' AS source
FROM table_1 a JOIN table_1_meta b ON a.primary_key = b.primary_key
WHERE a.address_line_1 = '1234 Fake St' AND a.city = 'Beverly Hills' AND a.zip = '90210'
UNION ALL
SELECT a.primary_key, a.field1, b.field1 AS field2, 'Two' AS source
FROM table_2 a JOIN table_2_meta b ON a.primary_key = b.primary_key
WHERE a.address_line_1 = '1234 Fake St' AND a.city = 'Beverly Hills' AND a.zip = '90210'
UNION ALL
SELECT a.primary_key, a.field1, b.field1 AS field2, 'Three' AS source
FROM table_3 a JOIN table_3_meta b ON a.primary_key = b.primary_key
WHERE a.address_line_1 = '1234 Fake St' AND a.city = 'Beverly Hills' AND a.zip = '90210'
UNION ALL
SELECT a.primary_key, a.field1, b.field1 AS field2, 'Four' AS source
FROM table_4 a JOIN table_4_meta b ON a.primary_key = b.primary_key
WHERE a.address_line_1 = '1234 Fake St' AND a.city = 'Beverly Hills' AND a.zip = '90210'
請不要給出任何暗示我自己重組資料/表格的答案,只要說在這種情況下這不是一個選擇就足夠了。我有興趣了解是否可以重構此特定查詢以合并相同的 WHERE 子句。
uj5u.com熱心網友回復:
正如上面評論中提到的,您可以在沒有WHERE 子句的情況下合并多個查詢,然后將其視為一次應用 WHERE 子句的派生表。
它的外觀如下:
SELECT t.primary_key, t.field1, t.field2, t.source FROM (
SELECT a.primary_key, a.field1, b.field1 AS field2, 'One' AS source, a.address_line_1, a.city, a.zip
FROM table_1 a JOIN table_1_meta b ON a.primary_key = b.primary_key
UNION ALL
SELECT a.primary_key, a.field1, b.field1 AS field2, 'Two' AS source, a.address_line_1, a.city, a.zip
FROM table_2 a JOIN table_2_meta b ON a.primary_key = b.primary_key
UNION ALL
SELECT a.primary_key, a.field1, b.field1 AS field2, 'Three' AS source, a.address_line_1, a.city, a.zip
FROM table_3 a JOIN table_3_meta b ON a.primary_key = b.primary_key
UNION ALL
SELECT a.primary_key, a.field1, b.field1 AS field2, 'Four' AS source, a.address_line_1, a.city, a.zip
FROM table_4 a JOIN table_4_meta b ON a.primary_key = b.primary_key
) AS t
WHERE t.address_line_1 = '1234 Fake St' AND t.city = 'Beverly Hills' AND t.zip = '90210'
您可能會注意到,每個聯合查詢都必須公開列address_line_1, city,zip以便它們在派生表中可用。否則,外部查詢中的 WHERE 條件將無法參考它們。它們必須是派生表的列。但是您不必在外部查詢的選擇串列中包含這些額外的列。
所以最終它看??起來并沒有在打字方面節省很多。
這樣做的一個可能的缺點是派生表可能有數百萬行并構建一個巨大的臨時表來保存它們,只是讓它們大部分被外部查詢的 WHERE 子句中的條件過濾掉。
不能保證您的 SQL 引擎足夠聰明,可以將條件傳播到構成派生表的每個聯合查詢。這可以在您使用的某些 SQL 實作中實作。
但你只用sql. 該標簽通常在 Stack Overflow 上用于 SQL 語言,而不是任何實作 SQL 的特定品牌或產品。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/441841.html
標籤:sql
上一篇:搜索資料庫中包含特定列的所有表
下一篇:在sql中帶大小寫的Div0
