Autor | Zpráva | ||
---|---|---|---|
MaK Profil |
#1 · Zasláno: 19. 5. 2021, 12:01:33
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 * |
#2 · Zasláno: 19. 5. 2021, 12:06:30
MaK:
Já bych sebepoškozování zeptal, co potrebujes doopravdy udělat. Tohle vypadá na nějaký nesmyslný navrh databaze. |
||
Kajman Profil |
#3 · Zasláno: 19. 5. 2021, 14:23:54
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 |
#4 · Zasláno: 19. 5. 2021, 15:18:06
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 |
#5 · Zasláno: 19. 5. 2021, 15:34:17
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 |
#6 · Zasláno: 19. 5. 2021, 15:39:58
Kajman:
Ano, něco takového teď píši. Ale není to tak elegantní :) Děkuji. |
||
Kajman Profil |
#7 · Zasláno: 19. 5. 2021, 16:23:17
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 |
||
Časová prodleva: 3 roky
|
0