web-dev-qa-db-fra.com

Sélection de deux valeurs dans la même table mais dans des conditions différentes

Je veux récupérer une valeur d'une table dans deux colonnes différentes pour des valeurs différentes de la même table. Utilisez cette requête comme exemple (remarquez comment la sélection se trouve sur la même table aliasée que 2 tables différentes):

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

Lorsque j'exécute une requête relativement simple comme celle-ci sur mon ensemble de données, cela fonctionne - cela prend juste beaucoup de temps. Existe-t-il un moyen meilleur/plus intelligent d'écrire cette requête?

8
mattw

Pour plus de lisibilité, je réécrirais la requête en utilisant la syntaxe de jointure la plus moderne. Cela séparera clairement vos conditions de jointure de vos filtres.

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

Pour les performances, assurez-vous que vous disposez des index appropriés. Dans cet exemple limité, l'idéal serait d'avoir un index cluster sur ID et un index non cluster sur OtherVal.

Après avoir examiné votre requête, cependant, je ne peux pas dire exactement ce que vous essayez d'accomplir.

10
datagod

Vous pouvez utiliser le regroupement et l'agrégation conditionnelle, comme ceci:

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