2012-01-02 27 views
1

我有三個表,一個用戶表和兩個用戶類型表。用戶類型表有一個UserId字段,因此可以鏈接它們。現在的問題是我從用戶表中輸入一個條目。從正確的表格獲取數據的最佳方式是什麼?從右側未知表格中選擇數據,如何?

使用2個正確的連接是正確的還是可以做得更優雅?

回答

2

是的,但我會使用左外部連接。也就是說,您需要來自UserTable的行,並且可能來自相應的UserType表的行(如果存在這樣的行)。

下面是一個例子:

SELECT ... 
FROM UserTable u 
LEFT OUTER JOIN UserType1 t1 ON u.userid = t1.userid 
LEFT OUTER JOIN UserType2 t2 ON u.userid = t2.userid 

想必最多的用戶類型的一個表有一個條目。因此,t1。*或t2。*將成爲所有NULL的單行,並且由於笛卡爾積,您將不會獲得多行。

+0

好吧,這確實帶來性能問題表上大操作時規模還是這是一個健壯,快速的查詢?總是有一個右桌結果。 – Ben 2012-01-02 21:49:38

+0

這取決於您在UserType表中定義的索引,以及您在此查詢中從中獲取哪些列。如果您可以使查詢成爲僅索引查詢(「使用索引」出現在EXPLAIN報告中),那麼它會沒事的。 – 2012-01-02 21:51:29

+0

在這兩個usertype表中都有UserId上的索引,所以我想我很好。謝謝! +1並被接受。乾杯! – Ben 2012-01-02 21:54:08

0

除了LEFT JOIN,這裏還有哪些需要一些更多的工作表明,2個表可能具有不同列中的UNION

SELECT u.* 
     , t1.colA, t1.colB, ..., t1.colZ --- columns in both tables 1 and 2 
     , t1.col_1a, t1.col_1b, t1.col_1c --- columns in table 1 only 
     , NULL AS col_2a     --- columns in table 2 only 
     , NULL AS col_2b 
    FROM UserTable u 
    LEFT OUTER JOIN UserType1 t1 ON u.userid = t1.userid 
    UNION ALL 
    SELECT u.* 
     , t2.colA, t2.colB, t2.colC  --- columns in both tables 1 and 2 
     , NULL AS col_1a     --- columns in table 1 only 
     , NULL AS col_1b 
     , NULL AS col_1c 
     , t2.col_1a, t2.col_1b    --- columns in table 2 only 
    FROM UserTable u 
    LEFT OUTER JOIN UserType2 t2 ON u.userid = t2.userid