2011-07-11 19 views
1

讓我們有2個表。要查詢行,它們具有相同的ID,你必須這樣做:查詢來自2個僞造表,在同一個真實表中託管

SELECT * FROM Table1 A, Table2 B WHERE A.id = B.id 

現在我們的表合併爲一個全局表中,並添加前表列。因此,查詢

SELECT * FROM Table1 

現在看起來像:

SELECT * FROM GlobalTable WHERE tableId = 1 

但在第一次查詢應該怎麼現在看?

SELECT * FROM Table1 A, Table2 B WHERE A.id = B.id 

+0

你不應該使用隱式聯接,它們是一種糟糕的編程習慣,它經常會在你的查詢中產生細微的錯誤。大約20年前它們被很好的原因取代了。 – HLGEM

回答

2

一個表應該存儲一個實體。沒有「一個真正的查詢表」或「全球表」這樣的東西。你也不應該考慮一個EAV。這個問題是假設所有的表都具有相同的佈局......

不過,我期待着更多的後來代表時,它不能正常工作所以...

你應該用明確連接分離過濾器和如果你需要做一個OUTER JOIN加盟條件

Select * 
from 
    GlobalTable A 
    JOIN 
    GlobalTable B ON A.id = B.id 
WHERE 
    A.tableId = 1 AND B.tableId = 2 

,那麼你可以這樣寫

Select * 
from 
    (SELECT * FROM GlobalTable WHERE tableId = 1) A 
    LEFT JOIN 
    (SELECT * FROM GlobalTable WHERE tableId = 2) B ON A.id = B.id 

我建議使用索引視圖,雖然堅持「TABLEA 「和」tableB「作爲單獨的對象來避免這種持續的過濾。或者不要合併它們...

+0

你能否提供一些線索,爲什麼下面的答案不應該和JOIN應該? – noober

+0

@noober:工作原理相同,但JOIN更好。見http://stackoverflow.com/questions/5654278/sql-join-is-there-a-difference-between-using-on-or-where/5654338#5654338 – gbn

+0

哦......我明白了。謝謝。 – noober