0

persons主キーがという名前のテーブルがありますが、3 つの異なるテーブル (とpid呼びましょう)は外部キーです。ABCpid

pidこれらのテーブルのいずれかに特定のものが存在するかどうか、および正確にどれが存在するかを知る必要があります。

これが単一のクエリで達成できるかどうかはわかりませんが、特定のケースでは関数がよりうまく機能するので、これを行うことができると考えています:

SELECT pid, name, sex, func_name(pid) my_str
FORM persons
WHERE pid = 5

そして、pid が見つかったテーブルに応じて、次のmy_strようになります。

B | C

表とに意味pid = 5が見つかりました。BC

COUNT(*) を使用して、関数内の 3 つの SELECT でこれを行うことができます。結果が > 0 の場合はpid = 5、それぞれの SELECT からテーブルに見つかりました。しかし、これはばかげた方法のように思えますが、提案はありますか?

4

2 に答える 2

1

次のようなものがあなたのためにトリックをしますか?他のテーブルに存在するかどうかをテストする方法を示すために、case/whenを追加しました。

select p.pid
      ,p.name
      ,p.sex
      ,case when a.pid = p.pid then 'Yes' else 'No' end as in_a
      ,case when b.pid = p.pid then 'Yes' else 'No' end as in_b
      ,case when c.pid = p.pid then 'Yes' else 'No' end as in_c
  from persons p
  left outer join a on (a.pid = p.pid)
  left outer join b on (b.pid = p.pid)
  left outer join c on (c.pid = p.pid)
 where p.pid = 5;
于 2010-12-27T23:30:25.260 に答える
0

@Ronnisの回答の拡張(テストはしていませんが、このようなものが機能することを願っています。そうでない場合は、深夜まで許してください:))

select p.pid,
       p.name,
       p.sex,
       case when a.pid = p.pid then 'A' else '' end |
       case when b.pid = p.pid then 'B' else '' end |
       case when c.pid = p.pid then 'C' else '' end
  from persons p
  left outer join a on (a.pid = p.pid)
  left outer join b on (b.pid = p.pid)
  left outer join c on (c.pid = p.pid);
于 2010-12-27T23:34:00.890 に答える