it-swarm-eu.dev

Použití SELECT v klauzuli WHERE jiného SELECT

Vytvořil jsem návrh vzdálené aplikace na vrcholu libpq pro PostrgreSQL. Chová se dobře, ale profiloval jsem obecné fungování aplikace. Pro každý konečný obchodní výsledek, který produkuji, se stává, že volám něco jako 40 select klauzule (přes tcpip).

Mám připomínky z SQL-Serveru, které mi připomínají, abych minimalizoval počet interakcí mezi mou vzdálenou aplikací a databází. Po analýze mých výběrů si myslím, že bych mohl snížit toto číslo na 3 SELECT klauzulí, pomocí spojení. Ale nepamatuji si syntaxi pro použití výsledku SELECT v jiném SELECT.

Např.:

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'

Tento další SELECT by byl jednoduše takového druhu:

SELECT identifier FROM another_table WHERE something='something'

Zde je zjednodušené rozložení tabulek, několikrát odmítnuto pro různé typy item_types ... (3 zcela odlišné typy, tedy 3 dotazy SQL, pokud jsou optimalizovány).

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

Existuje několik id_item pro jednoho id_passage.
Existuje několik id_item_detail pro jednoho id_item.

Jak byste to napsali?
Jaký je název pro popis akce přesměrování jednoho výběru do jiného (pokud existuje)?

25
Stephane Rolland

To je to, na co se zaměřujete? Ujistěte se, že porovnávaná pole jsou srovnatelná (tj. Obě pole jsou numerická, textová, logická atd.).

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

Pokud si přejete vybrat na základě více hodnot:

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

Můžete to jen přepsat jako další JOIN . To je obvykle nejjednodušší a nejrychlejší:

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

Trochu jsem také zjednodušil a zbavil se bezdůvodného hláskování identifikátorů CamelCase.

11