2014-03-26 58 views
0

我要保持一個應用程序誰的數據庫是有點失控了,我有以下挑戰加入3個表:SQL:聯合2個表,然後加入另一個表。有沒有更好的方法來做到這一點?

表1 時間戳,ZID,AAA

表2 時間戳,ZID,BBB

table3 id,some,other,data

因此,表1和表2需要在它們的時間戳列上進行連接和排序。我還需要保留table1的aaa和table2的bbb列,並能夠區分它是aaa還是bbb。然後我需要通過它的zid列將它加入到另一個表中。

這是我工作的SQL本:

SELECT * 

FROM 
    table3 
    LEFT JOIN 
    (
    SELECT table1.timestamp AS timestamp, 
     table1.zid, 
     table1.aaa AS responses, 
     'aaas' 
    FROM table1 

    UNION ALL 
    SELECT table2.timestamp AS timestamp, 
     table2.zid, 
     table2.aaa AS responses, 
     'bbbs' 
    FROM table2 

    ) aaasAndbbbs ON table3.id = aaasAndbbbs.zid 

ORDER BY timestamp ASC; 

上面的SQL不正是我想要的,但我想知道是否有更好的方法。在這裏,我使用「aaas」列來區分它是aaa還是bbb--這看起來有點冒險。有沒有更好的方法去做我想要的?

+0

你並不真正加入table1和table2,你只是組合數據集。定義源字段來源的附加列似乎是正確的方法。如果沒有某種標誌,數據是來自'aaa'列還是'bbb'列,你還能怎麼知道?這些表的商業用途是什麼? 'aaa'和'bbb'是非常通用的... –

+0

aaas列是我正在使用的標誌。我目前也無法修改數據庫 – red888

+0

@ user1028270:您能否更多地瞭解一下table1和table2中數據的性質?如果可能的話,我會盡量避免使用'UNION'(例如,如果table1包含當前數據,並且table2具有歷史記錄,則查詢可以很容易地在沒有聯合的情況下重寫)。 – a1ex07

回答

0

另一種方法是單獨執行每一項,您將看到表3中的左連接被重複。不過,我懷疑如果你看看你的版本和我的版本的執行計劃,他們將是相同的。 SQL Server Optimiser應該足夠聰明,以便弄清楚兩者都在做同樣的事情,並因此以相同的方式執行。我覺得這比你的可讀性略好一點,但那是我的偏好!

SELECT table1.timestamp AS timestamp, 
    table1.zid, 
    table1.aaa AS responses, 
    'aaas' 
FROM table3 
LEFT JOIN table1 on table3.id = table1.zid 

UNION 

SELECT table2.timestamp AS timestamp, 
    table2.zid, 
    table2.aaa AS responses, 
    'bbbs' 
FROM table3 
LEFT JOIN table1 on table3.id = table2.zid 
ORDER BY timestamp ASC; 
+0

OP正在從'table3'中選擇,然後離開table1和table2的連接,反之亦然。你的'LEFT JOIN'必須是'RIGHT JOIN'才能返回與問題中相同的結果。 – a1ex07

+0

絕對正確。發佈更新。 – sarin

+0

嗯試圖運行這與正確的連接按照評論和查詢需要很長的時間來執行...) – red888

相關問題