2012-12-19 54 views
0

我有一个名为“tc_person”的人表和名为“tc_marriage”的婚姻表。我想从我的人员表格中选择几列,并选择一列代表合作伙伴的ID。使用具有取决于主要查询的多个结果的子查询

婚姻表包括两个人的pid_1和pid_2 - 但重要的是,只有一对夫妇入境,而夫妇ID的顺序可能会有所不同。这里的表:

tc_person:

| id | name | lastname | 
-------------------------------------- 
| 4 | peter | smith | 
| 5 | sarah | smith | 

tc_marriage:

| id | pid_1 | pid_2 | 
-------------------------------------- 
| 0 |  5  |  4  | 
| 1 |  7  |  9  | 

看来,我的子查询的原始SELECT语句之前解释为一个整体。现在我收到错误,我的子查询返回多行。

SELECT p.id, p.name, p.lastname, 

(SELECT m.pid_1 FROM tc_marriage m WHERE m.pid_2 = p.id UNION 
SELECT m.pid_2 FROM tc_marriage m WHERE m.pid_1 = p.id) as partner_id 

FROM tc_person p WHERE p.lastname LIKE 'smith'; 

我找下面的输出:

| id | name | lastname | partner_id | 
----------------------------------------------------- 
| 4 | peter | smith |  5  | 
| 5 | sarah | smith |  4  | 

这甚至可能只有一个单一的查询?你现在可以告诉我,我是SQL noob。也许你们可以帮忙。

回答

1

您可以使用,以避免UNION(通常是慢),和一个CASE语句来挑选出正确的PARTNER_ID:

SELECT p.id, 
     p.name, 
     p.last_name, 
     CASE p.id WHEN m.pid_1 THEN m.pid_2 ELSE m.pid_1 END AS partner_id 
FROM tc_person p 
JOIN tc_marriage m ON p.id IN (m.pid_1, m.pid_2) 
0

你想要做的是加入的人表到婚姻表。但问题是你有两个键。一种解决方案是做两个连接,然后是一些逻辑来选择正确的值。

我宁愿通过交换伙伴来“加倍”婚姻表。以下查询在子查询中采用此​​方法:

select p.id, p.name, p.lastname, partner_id 
from tc_person p join 
    (select pid_1 as firstid, pid_2 as partner_id 
     from marriage 
     union all 
     select pid_2 as firstid, pid_1 as partner_id 
     from marriage 
    ) m 
    on p.id = m.firstid