Utilizzo di SELECT nella clausola WHERE di un altro SELECT


21

Ho creato una bozza di applicazione remota su libpq per PostrgreSQL . Si comporta bene, ma ho profilato il funzionamento generale dell'applicazione. Per ogni risultato commerciale finale che produco, succede che chiamo qualcosa come 40 clausola select (su tcpip).

Ho delle reminiscenze da SQL Server che mi ricordano di ridurre al minimo il numero di interazioni tra la mia applicazione remota e il database. Dopo aver analizzato le mie selezioni, penso di poter ridurre questo numero a 3 SELECTclausole, usando i join. Ma non ricordo la sintassi per usare il risultato di a SELECTin un altro SELECT.

Per esempio:

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'

Quest'altro SELECTsarebbe semplicemente del tipo:

SELECT identifier FROM another_table WHERE something='something'

Ecco il layout semplificato delle tabelle, rifiutato un numero di volte per diversi item_types ... (3 tipi totalmente diversi, quindi le 3 query SQL se ottimizzate).

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

Ce ne sono diversi id_itemper uno id_passage.
Ce ne sono diversi id_item_detailper uno id_item.

Come lo scriveresti?
Qual è il nome per descrivere l'azione di reindirizzamento di una selezione in un'altra (se presente)?



ti riferisci a 7.2.1.3. Sottoquery?
Stephane Rolland,

Forse sì, insieme alla parte JOIN.
dezso

Risposte:


30

È questo ciò a cui stai mirando? Assicurati che i campi che vengono confrontati siano comparabili (cioè entrambi i campi sono numerici, testo, booleano, ecc.).

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

Se si desidera selezionare in base a più valori:

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

può essere così diretto ?? funziona ancora se SELECT someID FROM table WHERE blahblahblahha più record? Lo controllerò adesso.
Stephane Rolland,

Quale query sta selezionando più record? Può funzionare se selezioni più record, ma se potessi mostrarci i layout della tabella che ci aiuterebbero a perfezionare la risposta.
Angry Spartan,

1
WHERE Individual.IndividualId IN...sembra buono.
Stephane Rolland,

10

Puoi semplicemente riscriverlo come un altro JOIN. Questo è normalmente il più semplice e veloce:

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

Ho anche semplificato un po 'e ho eliminato l'ortografia gratuita degli identificatori CamelCase.


1
Si Questo. Muoio un po 'dentro ogni volta che vedo la sintassi IN (SELEZIONA ..).
Mark Storey-Smith,

@ MarkStorey-Smith Vuoi dire che è più che semplice e veloce: questo è uno standard di codifica sql per usarne un altro joinanziché un in ( select...)In questo caso dovrei anche attribuire la buona risposta a Erwin.
Stephane Rolland,

1
@StephaneRolland Sia che sia più veloce o meno dipenderà dalla piattaforma e dalla versione. Ad esempio, SQL Server 2008+ genererà piani di esecuzione identici per la sintassi INNER JOIN e IN (SELECT ...). Non ho idea se lo stesso valga per PostgreSql. Prestazioni a parte, lo stile IN (SELEZIONA ...) mi lascia chiedermi se l'autore abbia compreso appieno la semantica e i concetti di SQL. AngrySpartan ha risposto correttamente alla tua domanda originale. ErwinBrandstetter ti ha mostrato il modo in cui dovresti farlo :).
Mark Storey-Smith,

6
@ MarkStorey-Smith: un JOIN non è sempre equivalente a una condizione IN. La domanda non è quale sia più veloce, la domanda è quale sia corretta.
a_horse_with_no_name l'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.