Usar SELECT en la cláusula WHERE de otro SELECT

21

Hice un borrador de aplicación remota sobre libpq para PostrgreSQL . Se comporta bien, pero he perfilado el funcionamiento general de la aplicación. Para cada resultado comercial final que produzco, sucede que llamo algo así como la cláusula 40 select (sobre tcpip).

Tengo reminiscencias de SQL-Server que me recuerdan minimizar la cantidad de interacciones entre mi aplicación remota y la base de datos. Después de analizar mis selecciones, creo que podría reducir este número a 3 SELECTcláusulas, usando combinaciones. Pero no recuerdo la sintaxis para usar el resultado de a SELECTen otro SELECT.

P.ej:

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'

Este otro SELECTsería simplemente del tipo:

SELECT identifier FROM another_table WHERE something='something'

Aquí está el diseño de tablas simplificado, rechazado varias veces para diferentes tipos de ítems ... (3 tipos totalmente diferentes, de ahí las 3 consultas SQL si están optimizadas).

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

Hay varios id_itempara uno id_passage.
Hay varios id_item_detailpara uno id_item.

¿Cómo escribirías eso?
¿Cuál es el nombre para describir la acción de redirigir una selección a otra (si corresponde)?

Stephane Rolland
fuente
te refieres a 7.2.1.3. Subconsultas?
Stephane Rolland
Posiblemente sí, junto con la parte JOIN.
dezso

Respuestas:

30

¿Es esto lo que estás buscando? Asegúrese de que los campos que se comparan sean comparables (es decir, ambos campos son numéricos, de texto, booleanos, etc.).

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

Si desea seleccionar en función de múltiples valores:

SELECT * FROM Individual
INNER JOIN Publisher
ON Individual.IndividualId = Publisher.IndividualId
WHERE Individual.IndividualId IN (SELECT someID FROM table WHERE blahblahblah)
Espartano enojado
fuente
¿puede ser tan sencillo? ¿sigue funcionando si SELECT someID FROM table WHERE blahblahblahtiene múltiples registros? Voy a comprobar eso ahora mismo.
Stephane Rolland
¿Qué consulta está seleccionando múltiples registros? Puede funcionar si selecciona varios registros, pero si pudiera mostrarnos los diseños de sus tablas que nos ayudarían a refinar la respuesta.
Angry Spartan
1
WHERE Individual.IndividualId IN...se ve bien.
Stephane Rolland
10

Puedes reescribir eso como otro JOIN. Esto normalmente es más simple y rápido:

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

También simplifiqué un poco y eliminé la ortografía gratuita de CamelCase de los identificadores.

Erwin Brandstetter
fuente
1
Si esto. Muero un poco por dentro cada vez que veo la sintaxis IN (SELECCIONAR ...).
Mark Storey-Smith
@ MarkStorey-Smith ¿Quiere decir que es más que simple y rápido: es un estándar de codificación SQL para usar otro en joinlugar de un? in ( select...)En tal caso, también debería atribuir la buena respuesta a Erwin.
Stephane Rolland
1
@StephaneRolland Ya sea que sea más rápido o no, dependerá de la plataforma y la versión. SQL Server 2008+, por ejemplo, generará planes de ejecución idénticos para la sintaxis INNER JOIN e IN (SELECT ...). No tengo idea de si lo mismo se aplica a PostgreSql. Dejando de lado el rendimiento, el estilo IN (SELECCIONAR ...) me deja preguntándome si el autor ha comprendido completamente la semántica y los conceptos de SQL. AngrySpartan ha respondido su pregunta original correctamente. ErwinBrandstetter te ha mostrado la forma en que debes hacerlo :).
Mark Storey-Smith
66
@ MarkStorey-Smith: un JOIN no siempre es equivalente a una condición IN. La pregunta no es cuál es más rápida, sino cuál es la correcta.
a_horse_with_no_name