it-swarm-eu.dev

Výběr dvou hodnot ze stejné tabulky, ale za různých podmínek

Chci uchopit hodnotu z tabulky do dvou různých sloupců pro různé hodnoty ze stejné tabulky. Tento dotaz použijte jako příklad (všimněte si, jak je výběr ve stejné tabulce s aliasy jako 2 různé tabulky):

SELECT a.myVal, b.myVal 
FROM MyTable a, MyTable b
WHERE 
  a.otherVal = 100 AND
  b.otherVal = 200 AND
  a.id = b.id

Když spustím relativně jednoduchý dotaz, jako je tento, v mém datasetu to funguje - trvá to jen dlouho. Existuje lepší/chytřejší způsob psaní tohoto dotazu?

8
mattw

Kvůli čitelnosti bych přepsal dotaz pomocí modernější syntaxe join. Tím se jasně oddělí vaše podmínky připojení od vašich filtrů.

select a.myVal,
       b.myVal
  from MyTable a
  join MyTable b on b.id = a.id
where a.OtherVal = 100
  and b.Otherval = 200

Pro výkon se ujistěte, že máte správné indexy. V tomto omezeném příkladu byste v ideálním případě měli klastrovaný index na ID a neklastrovaný index na OtherVal.

Po prozkoumání vašeho dotazu však nedokážu říct, čeho se snažíte dosáhnout.

10
datagod

Mohli byste použít seskupování a podmíněné agregování, například:

SELECT
  id,
  MAX(CASE OtherVal WHEN 100 THEN MyVal END) AS MyVal1,
  MAX(CASE OtherVal WHEN 200 THEN MyVal END) AS MyVal2
FROM MyTable
WHERE OtherVal IN (100, 200)
GROUP BY
  id
;
4
Andriy M