使用具有多个结果的子查询,这些结果取决于主查询

时间:2012-12-19 16:53:52

标签: mysql sql

我有一个名为“tc_person”的人员表和一个名为“tc_marriage”的婚姻表。我想从我的人员表中选择一些列,并选择一列代表合作伙伴的ID。

婚姻表包括两个人的pid_1和pid_2 - 但重要的是一对夫妇只有一个条目,夫妻ids的顺序可能会有所不同。这是表格:

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菜鸟。也许你们可以帮忙。

2 个答案:

答案 0 :(得分:1)

您可以使用IN来避免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)

答案 1 :(得分: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