0

「tc_person」という個人テーブルと「tc_marriage」という結婚テーブルがあります。個人テーブルからいくつかの列と、パートナーの ID を表す 1 つの列を選択したいと考えています。

結婚テーブルには 2 人の pid_1 と pid_2 が含まれていますが、カップルのエントリは 1 つだけであり、カップル 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 初心者であることがわかります。多分あなたたちは助けることができます。

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

あなたがしたいことは、人の表を結婚の表に結合することです。ただし、問題は、キーが 2 つあることです。1 つの解決策は、2 つの結合を実行してから、適切な値を選択するロジックを実行することです。

私は、パートナーを交換することによって、結婚テーブルを「2 倍」にすることを好みます。次のクエリは、サブクエリでこのアプローチを採用しています。

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 に答える