2012-12-19 51 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