Autor Zpráva
MaK
Profil
Mám dotaz:
SELECT neco FROM tableA    WHERE id = 123
UNION
SELECT neco FROM tableB    WHERE id = 123
UNION
SELECT neco FROM tableC    WHERE id = 123

kde 123 je nějaký identifikátor.

Mám tabulku tableX obsahující seznam identifikatorů:

CREATE TABLE tableX (id INT);
INSERT INTO tableX 
VALUES (100), (222), (356), (400), (555);

Chtěl bych "projet" tabulku tableX a pro každé id volat ten dotaz s uniony.

Nějak takhle:

SELECT id, dt.neco 
FROM tableX
JOIN (
  SELECT neco FROM tableA    WHERE id = tableX.id
  UNION
  SELECT neco FROM tableB    WHERE id = tableX.id
  UNION
  SELECT neco FROM tableC    WHERE id = tableX.id
) AS dt

Ale to NEJDE. Jak to udělat?

MaK
anonym_
Profil *
MaK:
Já bych sebepoškozování zeptal, co potrebujes doopravdy udělat. Tohle vypadá na nějaký nesmyslný navrh databaze.
Kajman
Profil
SELECT x.id, dt.neco 
FROM tableX x
JOIN (
  SELECT id, neco FROM tableA
  UNION
  SELECT id, neco FROM tableB
  UNION
  SELECT id, neco FROM tableC
) AS dt
ON dt.id = x.id
MaK
Profil
Kajman:
Nedopadne to tak, že nejdříve pospojuje tableA + tableB + tableC do jednoho setu, který pak připojí k tableX?

tableA + tableB + tableC má cca 100mil řádků

MaK
Kajman
Profil
Vyzkoušejte si, různé databáze a různá data mohou mít různé plány pro vykonávání. Pro porovnání to můžete přespat na union joinů.

SELECT t.id, t.neco FROM tableA t JOIN tableX x ON t.id = x.id
UNION
SELECT t.id, t.neco FROM tableB t JOIN tableX x ON t.id = x.id
UNION
SELECT t.id, t.neco FROM tableC t JOIN tableX x ON t.id = x.id
MaK
Profil
Kajman:
Ano, něco takového teď píši. Ale není to tak elegantní :)
Děkuji.
Kajman
Profil
Tak je možné tam nechat jen to id, celé to takto obalit a na výsledek unionů ještě jednou přilinkovat tableX, jestli to pomůže přehlednosti dotazu a neovlivní rychlost.

SELECT tx.*, d.neco FROM tableX tx
JOIN
(
  SELECT t.id, t.neco FROM tableA t JOIN tableX x ON t.id = x.id
  UNION
  SELECT t.id, t.neco FROM tableB t JOIN tableX x ON t.id = x.id
  UNION
  SELECT t.id, t.neco FROM tableC t JOIN tableX x ON t.id = x.id
) dt
ON tx.id = dt.id

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0