2012-09-10 266 views
1

我試圖選擇我認爲是兩種選擇來獲取相同的數據。聯盟的聯盟與聯盟的聯盟

我有一個表有感興趣的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 

或者除了這些還有更好的選擇嗎?

+0

我對你的應用程序一無所知,但是好像數據可能在單個表格中添加了一個像「type」這樣的列來代替舊的表名。那麼你根本不需要聯盟。查詢將變得更簡單和易於維護(這是非常重要的),你甚至可能得到一個小小的性能提升。 – 10flow

+2

在sql-server中你可以檢查執行計劃 –

回答

0

這將取決於你的數據看起來像每個表中的行數,所以你最好的選擇是嘗試兩種方法,看看是否更好。

但是,如果我假設每個表tx,cfu,sfu和bsl包含一百萬行,那麼我希望在將它們聯合起來之前將這四個大集合限制爲單行會更快一些創建一個400萬行的集合,然後加入它。

0

SQL Server可以將第一個轉換爲第二個而不是相反。這就是說,沒有辦法知道哪個更好,因爲它取決於很多事情(行數,過濾器選擇性......)。唯一可靠的答案是看計劃和/或測試。