我試圖選擇我認爲是兩種選擇來獲取相同的數據。聯盟的聯盟與聯盟的聯盟
我有一個表有感興趣的ID和一組相互相似的4個表有這些ID的數據。一旦我有每個ID的行,我將使用它們來獲取最大狀態字段或最小日期字段等(跨4個表格)。
我可以看到將此查詢結構化爲1連接到4個表的聯合,或者作爲4個聯接的聯合。哪個更有效率? FWIW,我發現第一個更容易理解,並且可能更容易維護。
拼寫出兩種選擇:
加入IDTABLE針對子選擇的4個表聯合在一起的:
select ss.id, ss.study, ss.status, ss.date
from (-- subselect ss
select tx.id, tx.study, tx.status, tx.date
from table_tx tx
UNION
select cfu.id, cfu.study, cfu.status, cfu.date
from table_cfu cfu
UNION
select sfu.id, sfu.study, sfu.status, sfu.date
from table_sfu sfu
UNION
select bsl.id, bsl.study, bsl.status, bsl.date
from table_bsl bsl
) ss
inner join
idTable id on id.id = ss.id AND id.study = ss.study
IDTABLE的聯合加入針對每個四個的:
select tx.id, tx.study, tx.status, tx.date
from table_tx tx
inner join
idTable id on id.id = tx.id AND id.study = tx.study
UNION
select cfu.id, cfu.study, cfu.status, cfu.date
from table_cfu cfu
inner join
idTable id on id.id = cfu.id AND id.study = cfu.study
UNION
select sfu.id, sfu.study, sfu.status, sfu.date
from table_sfu sfu
inner join
idTable id on id.id = sfu.id AND id.study = sfu.study
UNION
select bsl.id, bsl.study, bsl.status, bsl.date
from table_bsl bsl
inner join
idTable id on id.id = bsl.id AND id.study = bsl.study
或者除了這些還有更好的選擇嗎?
我對你的應用程序一無所知,但是好像數據可能在單個表格中添加了一個像「type」這樣的列來代替舊的表名。那麼你根本不需要聯盟。查詢將變得更簡單和易於維護(這是非常重要的),你甚至可能得到一個小小的性能提升。 – 10flow
在sql-server中你可以檢查執行計劃 –