web-dev-qa-db-ja.com

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

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

SQL-Serverからの思い出があり、リモートアプリケーションとデータベースの間のやり取りの数を最小限に抑えるように促しています。選択を分析した結果、結合を使用してこの数を3つのSELECT句に減らすことができると思います。しかし、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ごとに何度も省略されています...

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_item 1人用id_passage
いくつかありますid_item_detail 1人用id_item

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

25

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

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)
33
Angry Spartan

これを別の 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スペルを廃止しました。

11