web-dev-qa-db-fra.com

Utilisation de SELECT dans la clause WHERE d'un autre SELECT

J'ai créé un projet d'application distante au-dessus de libpq pour PostrgreSQL. Il se comporte bien, mais j'ai profilé le fonctionnement général de l'application. Pour chaque résultat commercial final que je produis, il arrive que j'appelle quelque chose comme 40 clause select (via tcpip).

J'ai des réminiscences de SQL-Server me rappelant de minimiser le nombre d'interactions entre mon application distante et la base de données. Après avoir analysé mes sélections, je pense que je pourrais réduire ce nombre à 3 SELECT clauses, en utilisant les jointures. Mais je ne me souviens pas de la syntaxe pour utiliser le résultat d'un SELECT dans un autre SELECT.

Par exemple.:

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'

Cet autre SELECT serait simplement du genre:

SELECT identifier FROM another_table WHERE something='something'

Voici la disposition simplifiée des tableaux, déclinée plusieurs fois pour différents item_types ... (3 types totalement différents, d'où les 3 requêtes SQL si optimisées).

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

Il y a plusieurs id_item pour un id_passage.
Il y a plusieurs id_item_detail pour un id_item.

Comment écririez-vous cela?
Quel est le nom pour décrire l'action de rediriger une sélection vers une autre (le cas échéant)?

25
Stephane Rolland

C'est ce que vous visez? Assurez-vous que les champs qui sont comparés sont comparables (c'est-à-dire que les deux champs sont numériques, texte, booléen, etc.).

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

Si vous souhaitez sélectionner en fonction de plusieurs valeurs:

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

Vous pouvez simplement réécrire cela comme un autre JOIN . C'est normalement le plus simple et le plus rapide:

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

J'ai également simplifié quelque peu et supprimé l'orthographe gratuite des identifiants CamelCase.

11
Erwin Brandstetter