Wie benutze ich das Ergebnis einer Subquery als Bedingung für die primäre Query?

  • Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Tabula_Rasa

Mitglied
12 Mai 2017
277
2
18
Hallo zusammen,

ich habe folgende Query:
SQL:
select type, lid from Profiles where lid_P=${profile.lid} and type_P='${profile.type}'; // kann zwischen 1-50 Ergebnisse enthalten

Jetzt müsste ich das Ergebnis nehmen also type und lid, um in einer anderen Tabelle nach Einträgen zu suchen:
Code:
select * from an where type=type and lid=lid;
// wobei lid und type die Resultate der vorigen Query sind

Letzten Endes möchte ich nur das Ergebnis der zweiten Query. Kann ich die Queries irgendwie kombinieren, sodass ich direkt das gewünschte Ergebnis bekomme, ohne weitere Abfragen starten zu müssen?
 

AndreasB

Neues Mitglied
24 März 2019
26
2
3
Du kannst in SQL über SELECT Abfragen, temporäre Tabellen anlegen und diese dann weiter verwenden.

Diese Subqueries kannst du in deinem Fall in der FROM Klausel verwenden.
Dabei musst du auf 2 Dinge achten:
1. Die Subquery steht in Runde Klammern.
2. Der Subquery bekommt immer einen Namen über einen Alias.

Dann kannst du auch mit Hilfe des Namens als Prefix auf die Werte der temporären Tabelle zugreifen.

Vom Schema her sieht das dann so aus.
SQL:
SELECT sub_query_name.*
FROM (
SELECT col1, col2,
FROM `test`
WHERE `test`.`col1`= 'my_val'
) as sub_query_name
WHERE sub_query_name.col1 = 'test'
 
  • Like
Reaktionen: Tabula_Rasa

Sempervivum

Senior HTML'ler
18 Oktober 2016
2.475
474
83
68
Oder mit einem Join:
Code:
SELECT col1, col2 from an, Profiles
   WHERE an.lid=Profiles.lid AND an.type=Profiles.type
       AND Profiles.lid_P=${profile.lid} AND Profiles.type_P=${profile.type}
 
  • Like
Reaktionen: Tabula_Rasa

Sempervivum

Senior HTML'ler
18 Oktober 2016
2.475
474
83
68
PS: Ich bin der Sache mit dem Join noch ein wenig nachgegangen, weil praktisch immer in den Queries, die man so liest, LEFT JOIN, INNER JOIN etc. explizit angegeben wird. Das Ergebnis ist, dass ein dramatischer Unterschied in der Performance besteht: Eine Testabfrage mit der Query aus #3 braucht 20 s, eine Version mit LEFT JOIN:
Code:
SELECT fullname from an
    LEFT JOIN Profiles ON an.lid=Profiles.lid
    WHERE an.type=Profiles.type AND Profiles.lid_P=99 AND Profiles.type_P='Ulli'
dagegen nur 0,15 s!
 
  • Like
Reaktionen: Tabula_Rasa