Verwendung von SELECT in der WHERE-Klausel eines anderen SELECT

21

Ich habe einen Entwurf für eine Remote-Anwendung über libpq für PostrgreSQL erstellt . Es verhält sich gut, aber ich habe die allgemeine Funktionsweise der Anwendung profiliert. Für jedes Endergebnis, das ich produziere, kann es vorkommen, dass ich so etwas wie 40 select-Klausel (über tcpip) aufrufe.

Ich habe Erinnerungen von SQL-Server, die mich daran erinnern, die Anzahl der Interaktionen zwischen meiner Remoteanwendung und der Datenbank zu minimieren. Nachdem ich meine ausgewählten Elemente analysiert habe, denke ich, dass ich diese Anzahl SELECTmithilfe von Joins auf 3 Klauseln reduzieren kann . Aber ich erinnere mich nicht an die Syntax für die Verwendung des Ergebnisses von a SELECTin einem anderen SELECT.

Z.B:

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'

Dieser andere SELECTwäre einfach von der Art:

SELECT identifier FROM another_table WHERE something='something'

Hier ist das vereinfachte Tabellenlayout, das mehrfach für verschiedene item_types abgelehnt wurde ... (3 völlig verschiedene Typen, daher die 3 SQL-Abfragen, falls optimiert).

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

Es gibt mehrere id_itemfür einen id_passage.
Es gibt mehrere id_item_detailfür einen id_item.

Wie würdest du das schreiben?
Wie wird die Aktion zum Umleiten einer Auswahl in eine andere (falls vorhanden) beschrieben?

Stephane Rolland
quelle
beziehen Sie sich auf 7.2.1.3. Unterabfragen?
Stephane Rolland
Möglicherweise ja, zusammen mit dem JOIN-Teil.
Dezso

Antworten:

30

Ist es das, was Sie anstreben? Stellen Sie sicher, dass die zu vergleichenden Felder vergleichbar sind (dh beide Felder sind numerisch, text, boolesch usw.).

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

Wenn Sie basierend auf mehreren Werten auswählen möchten:

SELECT * FROM Individual
INNER JOIN Publisher
ON Individual.IndividualId = Publisher.IndividualId
WHERE Individual.IndividualId IN (SELECT someID FROM table WHERE blahblahblah)
Wütender Spartaner
quelle
Kann es so einfach sein? funktioniert es immer noch, wenn SELECT someID FROM table WHERE blahblahblahmehrere Datensätze vorhanden sind? Ich werde das gleich überprüfen.
Stephane Rolland
Welche Abfrage wählt mehrere Datensätze aus? Es kann funktionieren, wenn Sie mehrere Datensätze auswählen, aber wenn Sie uns Ihre Tabellenlayouts anzeigen könnten, die uns helfen, die Antwort zu verfeinern.
Angry Spartan
1
WHERE Individual.IndividualId IN...sieht gut aus.
Stephane Rolland
10

Sie können das einfach als ein anderes umschreiben JOIN. Dies ist normalerweise am einfachsten und schnellsten:

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

Ich habe auch etwas vereinfacht und auf die kostenlose Schreibweise von Bezeichnern in CamelCase verzichtet.

Erwin Brandstetter
quelle
1
Ja das. Ich sterbe ein wenig im Inneren, wenn ich IN (SELECT ..) Syntax sehe.
Mark Storey-Smith
@ MarkStorey-Smith Meinst du, dass es mehr als einfacher und schneller ist: Dies ist ein Standard der SQL-Codierung, einen anderen joinanstelle eines zu verwenden? in ( select...)In einem solchen Fall sollte ich Erwin auch die gute Antwort zuschreiben.
Stephane Rolland
1
@StephaneRolland Ob es schneller ist oder nicht, hängt von der Plattform und der Version ab. SQL Server 2008+ generiert beispielsweise identische Ausführungspläne für die Syntax INNER JOIN und IN (SELECT ...). Keine Ahnung, ob das auch für PostgreSql gilt. Abgesehen von der Performance frage ich mich, ob der Autor die Semantik und die Konzepte von SQL vollständig verstanden hat. AngrySpartan hat Ihre ursprüngliche Frage richtig beantwortet. ErwinBrandstetter hat dir gezeigt, wie du es machen sollst :).
Mark Storey-Smith
6
@ MarkStorey-Smith: Ein JOIN entspricht nicht immer einer IN-Bedingung. Die Frage ist nicht, welcher schneller ist, die Frage ist, welcher richtig ist.
a_horse_with_no_name