我有一个名为“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菜鸟。也许你们可以帮忙。
答案 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