2016-12-07 12 views
2

は(私はそれを試してみましたが、この文が機能していません知っている)、この可能性のようなものですWHERE TXまたはTY(ZからIDを選択)中のT:SELECT * FROM

SELECT * FROM t WHERE t.x OR t.y IN (SELECT id FROM z) 

表T:

|id|x |y 
|1 |101|201 
|2 |102|202 

表Z:

|id | 
|101 | 
|201 | 

そしてこのテーブルから、テーブルxのIDのリストに属性xまたは属性yのいずれかが含まれているすべてのエントリを選択します。

私は

SELECT * FROM t WHERE t.x IN (SELECT id FROM z) OR t.y IN (SELECT id FROM z) 

を行うことができます知っているが、IN値は(両方IN句で同じである)複雑なサブクエリから来ているとき、それは非常に非効率的であるように、これは感じています。

または両方サブクエリは、同じ結果を与え、これだけの時間を実行することを確認してくれ、現在の問い合わせプランナの実装ですか?または、私は現在見ていないEXISTSを使用して別の解決策がありますか?

PS:私はPostgresのを使用していますが、私は、一般的な解決策を探しています。

答えて

4

使用EXISTS

SELECT * FROM t WHERE exists (SELECT 1 FROM z where z.id in (t.x,t.y)) 
+0

作品完璧に...ありがとう! – unwichtich

1

zが複雑なクエリである場合は、コードを簡素化するためにCTEを使用することができます。

WITH z AS (
     . . . 
    ) 
SELECT * 
FROM t 
WHERE t.x IN (SELECT id FROM z) OR t.y IN (SELECT id FROM z); 

また、代わりにJOINまたはEXISTSを使用することができます。

SELECT * 
FROM t 
WHERE EXISTS (SELECT 1 
       FROM z 
       WHERE z.id IN (t.x, t.y) 
      ); 

JOINバージョンでは、行がzに重複が原因で掛けることができます欠点を持っています。

上記、2つのIN式を持つバージョンは、おそらく最も効率的です。

0

試してみてください...

SELECT t.* FROM t join z on t.x = z.id or t.y = z.id 
+0

これはidが必要であれば、次にあなたが 'distinct'を使用することができますz'テーブル –

+0

ではありません。 –

+0

'で重複している場合、これは重複レコードをもたらす可能性が必ずしも同じもの –