2016-11-24 29 views
0

単一のクエリに外国ユニオンクエリを変換ユーザーにキー)
モード(PUBLICまたはPRIを受け入れることができますVATE)SQL:(私はこの</p> <p><strong>ユーザー</strong><br> ID <br> matricule</p> <p><strong>ドキュメント</strong><br> ID <br> タイトル<br> user_idのようなデータベースのスキーマを持って

私は公開され、すべての文書と特定のユーザーに属するすべての文書(matricule)

を取得したい私でした。このようなユニオンクエリ:

select * document d 
Inner join user u ON u.id = d.user_id 
and u.matricule ='matricule1' 
UNION 
select * from document d 
Inner join user u ON u.id = d.user_id 
where d.mode ='PUBLIC' 

うまく動作しますが、サブクエリのような別の方法で同じ結果を得ることができますか(私はどこかでユニオンクエリがパフォーマンスに悪いと読んでいます)?

UNIONと同じように重複を削除する

非常
+0

@a_horse_with_no_name私はpostgreSQLを使用しています。 – ulquiorra

答えて

4
select distinct * 
from document d 
Inner join user u ON u.id = d.user_id 
where u.matricule = 'matricule1' or d.mode ='PUBLIC' 

SELECT DISTINCT、ありがとうございました。 (おそらく、あなただけのSELECTをしたいですか?)

+0

とても速いです。どうもありがとうございます:) – ulquiorra

+0

もし両方のテーブルにプライマリキーがあれば(ほとんどのテーブルは*のように*)、 '*'を返すので、本当に必要な 'DISTINCT'がありますか?これはちょうどニックピッキングと推測であり、私はちょうどそこにこのアイデアを投げると思った、とにかく私は+1した。 –

+0

@RaduGheorghiu、おそらく不要ですが、OPはpkを指定していません。 – jarlh

1

あなただけdocumentテーブルから列をしたいと仮定すると、これはまた、以下のように書くことができる

select * 
from document d 
where exists (select * 
       from "user" u 
       where u.id = d.user_id 
       and u.matricule = 'matricule1') 
or d.mode ='PUBLIC' 

これはUNIONは、暗黙的に行い、必要となる不要な重複を削除可能溶液の場合はJOINである。

ただし、にはがあり、両方のソリューションの実行計画を確認してください。場合によっては、UNION解決策が実際には上記(またはJOIN)より高速かもしれません。これは、使用されているDBMSに大きく依存します(例:PostgresまたはOracleの場合、この場合は大きな違いはありません)。

+0

。大変ありがとうございます。 +1 :)。どのようにしてクエリの実行計画を確認できますか?あなたは良いリンクをお願いしますか? – ulquiorra

関連する問題