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)?
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)
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.