2012-08-27 42 views
0

我必須在現有的SQL數據庫上構建應用程序,並且遇到了這種情況。在2個表之間加入查詢,第一個帶有幾個字段,引用了另一個字段中的相同字段

有一個表(稱之爲T1),其中多個字段從另一個表(T2),其基本上是由僅2字段,IdName的參考值。因此,T2擁有不同性質和含義的數據,因爲與其相關的T1中的字段具有非常不同的種類。 (這在我看來是一個不尋常的設計。)

我的問題:給定這種設計,我如何建立一個連接查詢,以獲得T2.Name與每個T1字段相關的值。

編輯

我能得到我想要的東西做每場一個查詢:

SELECT t2.name AS name1 
FROM t1 
INNER JOIN t2 
ON t1.field1 = t2.id; 

SELECT t2.name AS name2 
FROM t1 
INNER JOIN t2 
ON t1.field2 = t2.id; 

SELECT t2.name AS name3 
FROM t1 
INNER JOIN t2 
ON t1.field3 = t2.id; 

但是,這完全是無稽之談。那麼,我怎樣才能將所有這些打包在一個查詢中?

+0

對於每個外鍵列表t2再次給它不同的別名。 –

+0

會[此](http://stackoverflow.com/a/12076322/1514813)沒有幫助? – TheGeekZn

回答

1

您需要以alias參考t2得到相應的名字:

SELECT alias1.name AS name1, 
     alias2.name AS name2, 
     alias3.name AS name3 
    FROM t1 
INNER JOIN t2 alias1 
    ON t1.field1 = alias1.id 
INNER JOIN t2 alias2 
    ON t1.field2 = alias2.id 
INNER JOIN t2 alias3 
    ON t1.field3 = alias3.id; 

如果外鍵可以爲空,您可能想要用左連接替換內層。

+0

謝謝,這正是我需要的。 –

+0

@GlauberRocha不客氣:-) –

0

沒有看到表結構,你可以做這樣的事情:

SELECT t1.col1, 
    t1.col2, 
    t1.id as t1_id, 
    t2.id as t2_id, 
    t2.name as t2_name 
FROM t1 
INNER JOIN t2 
    ON t1.id = t2.id 

既然你要加入的表,你只會給不同的別名出現兩個表中的列。根據您的更新

,你應該能夠對那些3個查詢合併到一個:

SELECT t2.name AS name1 
FROM t1 
INNER JOIN t2 
    ON t1.field1 = t2.id 
    OR t1.field2 = t2.id 
    OR t1.field3 = t2.id 
0

是否有任何理由,你不能使用你的加入手術室?所以:

SELECT t2.name AS name3 
FROM t1, t2 
WHERE t1.field1 = t2.id 
OR t1.field2 = t2.id 
OR t1.field3 = t2.id; 

如果由於某種原因,你不能,你可以使用UNION到所有查詢的結果在一個單一的查詢合併。我不知道你使用哪RDBMS但Postgres的你可以在這裏找到的信息: http://www.postgresql.org/docs/8.3/static/queries-union.html

對於任何其他DBMS名稱的快速谷歌和「聯盟」應該給你你需要什麼。

0

嘗試這樣的事情,

SELECT t2.name AS NAME1,
(情況下,當t1.field1 = t2.id然後 '類型1' 時t1.field2 = t2.id然後 '2型'其他 '類型3' 端)爲
類型從T1
INNER JOIN T2 ON t1.field1 = t2.id
或 t1.field2 = t2.id
或t1.field3 = t2.id

相關問題