2011-06-07 69 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