2010-12-27 9 views
0

pidは外部キーで、私は3つの異なるテーブル(ABCと呼ぶ)よ​​りもプライマリキーがpidであるテーブルを持っています。複数のテーブルに特定のIDが存在し、Oracleには特定のIDが存在するかどうかをチェックする方法は?

具体的なpidがこれらのテーブルのいずれかに存在し、そのうちのどれかが正確にわかっている必要があります。

これは、単一のクエリで達成可能である場合、私は知らないが、私はこれを行うことができるように機能が私の特定の場合にはより良い仕事だろうと思っている:

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

そして、依存pid = 5をテーブルBC上で発見された意味

B | C 

:PIDが発見されたテーブルの上に、my_strはようなものになるだろう。

これは、関数内で3つのSELECTを使用してCOUNT(*)を使用して行うことができます。結果が0より大きい場合、それぞれのSELECTからテーブルにpid = 5が見つかりました。しかし、これはそれを行うための愚かな方法、示唆ですか?

答えて

1

次のようなものがあなたのトリックですか?私はケース/ whensを追加して、他のテーブルに存在をテストする方法を示しました。

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; 
+0

これはほとんど動作しています。それはまったく同じ値を持つレコードの束を返し、私は1つだけ必要です。 'pid'に' GROUP BY'を使用しようとしましたが動作しません。 –

+0

気にしないで、代わりにDISTINCTを使って解決してください。 –

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); 
関連する問題