別のSELECTのWHERE句でSELECTを使用する


21

私はのためのlibpqの上にドラフトリモートアプリケーション作ったPostrgreSQLを。うまく動作しますが、アプリケーションの一般的な機能をプロファイルしました。私が作成する最終的なビジネス結果ごとに、40のselect句(tcpip経由)などを呼び出すことがあります。

リモートアプリケーションとデータベースの間のやり取りの数を最小限に抑えることを思い出させるSQL-Serverの思い出があります。選択を分析した結果、SELECT結合を使用してこの数を3つの節に減らすことができると思います。しかしSELECT、別のの結果を使用するための構文を覚えていませんSELECT

例えば:

SELECT * FROM individual
INNER JOIN publisher
ON individual.individual_id = publisher.individual_id
WHERE individual.individual_id = 'here I would like to use the results of a another select'

これSELECTは単純に他の種類です:

SELECT identifier FROM another_table WHERE something='something'

以下は、さまざまなitem_typesに対して何度も拒否された単純化されたテーブルレイアウトです...(3つのまったく異なるタイプ、したがって最適化された場合は3つのSQLクエリ)。

table passage
  id_passage PK
  business_field_passage bytea

table item
  id_item PK
  id_passage FK
  business_field_item text

table item_detail
  id_item_detail PK
  id_item FK
  business_field_item_detail text
  image_content bytea

id_item1つにいくつかありますid_passage。1つに
いくつかあります。id_item_detailid_item

それをどう書く?
1つの選択を別の選択にリダイレクトするアクション(ある場合)を説明するための名前は何ですか?



7.2.1.3を参照していますか。サブクエリ?
ステファンローランド

おそらく、JOINパートと一緒に。
-dezso

回答:


30

これはあなたが目指しているものですか?比較されるフィールドが比較可能であることを確認してください(つまり、両方のフィールドが数値、テキスト、ブールなどです)。

SELECT * FROM Individual
INNER JOIN Publisher
ON Individual.IndividualId = Publisher.IndividualId
WHERE Individual.IndividualId = (SELECT someID FROM table WHERE blahblahblah)

複数の値に基づいて選択する場合:

SELECT * FROM Individual
INNER JOIN Publisher
ON Individual.IndividualId = Publisher.IndividualId
WHERE Individual.IndividualId IN (SELECT someID FROM table WHERE blahblahblah)

それは簡単ですか?? SELECT someID FROM table WHERE blahblahblah複数のレコードがある場合でも動作しますか?今すぐ確認します。
ステファンローランド

どのクエリが複数のレコードを選択していますか?複数のレコードを選択している場合は機能しますが、答えを絞り込むのに役立つテーブルレイアウトを表示できる場合です。
怒っているスパルタン

1
WHERE Individual.IndividualId IN...いいね。
ステファンローランド

10

それを別のものとして書き直すことができJOINます。これは通常、最も簡単で最速です。

SELECT i.*, p.*
FROM   individual    i
JOIN   publisher     p USING (individualid)
JOIN   another_table a ON a.identifier = i.individualid
WHERE  a.something = 'something'

また、多少簡略化して、識別子の無料のCamelCaseスペルを廃止しました。


1
はい、これ。IN(SELECT ..)構文を見るたびに、私は少し死んでしまいます。
マークストーリースミス

@ MarkStorey-Smithそれはもっと簡単で速いということですか?これはSQLコーディングの標準でjoinあり、代わりに別のものを使用するin ( select...)ような場合です。
ステファンローランド

1
@StephaneRollandより高速かどうかは、プラットフォームとバージョンに依存します。たとえば、SQL Server 2008+は、INNER JOINおよびIN(SELECT ...)構文に対して同一の実行プランを生成します。同じことがPostgreSqlに当てはまるかどうかはわかりません。パフォーマンスはさておき、IN(SELECT ...)スタイルは、著者がSQLのセマンティクスと概念を完全に把握しているかどうか疑問に思っています。AngrySpartanは元の質問に正しく答えました。ErwinBrandstetterは、あなたがそれ行うべき方法を示しました:)。
マークストーリースミス

6
@ MarkStorey-Smith:JOINは常にIN条件と同等ではありません。問題はどちらが速いかではなく、どちらが正しいかです。
a_horse_with_no_name
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.