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

4

2 回答 2

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)
于 2012-12-19T16:57:47.313 回答
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
于 2012-12-19T16:58:42.923 回答