2011-06-07 114 views
1

我有一個包含3列引用另一個表的ID的數據表。Sql子查詢問題

表1: idperson1_idperson2_idperson3_id

人: idfnamelname

是什麼返回我的查詢fname和代替person1_id的最有效的方法是什麼?

+0

你能提供更多關於你要查詢的內容的細節嗎?如果你有表1的id,你想要table2中的data1的值嗎? – 2011-06-07 22:17:57

+0

我編輯我的問題,更具體的細節 – nathanjosiah 2011-06-07 22:19:55

回答

2
SELECT 
    a.id, 
    x.fname, 
    y.fname, 
    z.fname 
FROM 
    table1 a 
    INNER JOIN people x ON x.id = a.person1_id 
    INNER JOIN people y ON y.id = a.person2_id 
    INNER JOIN people z ON z.id = a.person3_id 
+0

這正是我所需要的,也是有效的 – nathanjosiah 2011-06-20 21:41:56

1

不知道如果我的理解這個問題很好,但:

SELECT table2.data1 FROM table1 INNER JOIN table2 WHERE table1.o1=table2.id 
+0

的工作,但它只會拉第一個人的名字,我也需要person2和person3的名字 – nathanjosiah 2011-06-07 22:19:18

+0

我發現顯式連接導致較少混淆。我將上面寫爲:SELECT table2.data1 FROM table1 INNER JOIN table2 ON table1.o1 = table2.id – 2011-06-07 22:20:28

+1

只需添加「OR」子句即可獲取person2和person3的名稱。 – patapizza 2011-06-07 22:22:54

0

您是不是要找這樣的事:

SELECT table1.id, table2.data1 FROM table1 LEFT JOIN table2 ON table1.o1 = table2.id; 

1

這是關於如何將數據格式化的猜測,但對於table1中的每個記錄聽起來都像是,您想用people表中的名字替換ID。

試試這個:

SELECT 
    id, 
    (SELECT fname FROM people WHERE id = person1_id) as Person1_fname, 
    (SELECT fname FROM people WHERE id = person2_id) as Person2_fname, 
    (SELECT fname FROM people WHERE id = person3_id) as Person3_fname 
FROM 
    table1 

這會給你所有記錄在表1和與第一名稱「取代」標識的,像這樣:

1, George, Chris, Judy 
2, Sam, Jennifer, Sara 

隨着

一表1
1, 1, 2, 3 
2, 4, 5, 6 

and a people table

1, George, Carlin 
2, Chris, Rock 
3, Judy, Smith 
4, Sam, Elliot 
5, Jennifer, Garner 
6, Sara, Johnson 

我假設在people.id上有一個唯一的約束。如果沒有,你需要在3個字段查詢中的fname之前放置一個TOP 1。

+1

這樣做並不是非常有效的方法 - 由於性能,更好地使用JOIN。 – Xaerxess 2011-06-14 07:39:25

0

我認爲這可能會對您有所幫助。我把table1作爲樣本

SELECT sample.*,person.fname,p.fname FROM sample left join person on sample.p1=person.id, sample s left join person p on s.p2=p.id group by sample.id