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

21

J'ai créé un projet d'application distante sur libpq pour PostrgreSQL . Il se comporte bien, mais j'ai dressé le profil du 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 SELECTclauses, en utilisant des jointures. Mais je ne me souviens pas de la syntaxe pour utiliser le résultat d'un SELECTdans 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 SELECTserait 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 en a plusieurs id_itempour un id_passage.
Il y en a plusieurs id_item_detailpour 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)?

Stéphane Rolland
la source
faites-vous référence à 7.2.1.3. Sous-requêtes?
Stephane Rolland
Peut-être oui, avec la partie JOIN.
dezso

Réponses:

30

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)
Spartan en colère
la source
peut-il être aussi simple que ça ?? cela fonctionne-t-il toujours s'il SELECT someID FROM table WHERE blahblahblaha plusieurs enregistrements? Je vais vérifier ça maintenant.
Stephane Rolland
Quelle requête sélectionne plusieurs enregistrements? Cela peut fonctionner si vous sélectionnez plusieurs enregistrements, mais si vous pouviez nous montrer vos dispositions de tableau qui nous aideraient à affiner la réponse.
Angry Spartan
1
WHERE Individual.IndividualId IN...Cela semble bon.
Stephane Rolland du
10

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.

Erwin Brandstetter
la source
1
Oui ca. Je meurs un peu à l'intérieur chaque fois que je vois la syntaxe IN (SELECT ..).
Mark Storey-Smith
@ MarkStorey-Smith Voulez-vous dire que c'est plus que simple et plus rapide: c'est un standard de codage sql pour en utiliser un autre joinau lieu d'un in ( select...)Dans ce cas, je dois également attribuer la bonne réponse à Erwin.
Stephane Rolland
1
@StephaneRolland Que ce soit plus rapide ou non dépendra de la plateforme et de la version. SQL Server 2008+, par exemple, générera des plans d'exécution identiques pour la syntaxe INNER JOIN et IN (SELECT ...). Aucune idée de savoir si cela s'applique à PostgreSql. Mis à part les performances, le style IN (SELECT ...) me laisse me demander si l'auteur a bien compris la sémantique et les concepts de SQL. AngrySpartan a répondu correctement à votre question d'origine. ErwinBrandstetter vous a montré la façon dont vous devriez le faire :).
Mark Storey-Smith
6
@ MarkStorey-Smith: un JOIN n'est pas toujours équivalent à une condition IN. La question n'est pas de savoir laquelle est la plus rapide, la question est de savoir laquelle est correcte.
a_horse_with_no_name