La meilleure façon de SQL à l'auto-jointure trois table de champ, de sorte que les touches sans les valeurs affectées à la clé et en particulier le comte

0

La question

Disons que nous avons un tableau:

clé valeur _count
un b 3
c d 2

que nous voulons développer, de sorte que chaque clé est tracé pour chaque valeur distincte dans le tableau et obtient une _count de 0 si la paire clé-valeur n'a pas déjà un compte. Par exemple, pour le tableau ci-dessus, j'aimerais voir:

clé valeur _count
un b 3
un d 0
c d 2
c b 0

J'ai une solution qui fonctionne:

WITH key_value_pairs AS (
  SELECT 
    a.key, 
    b.value
  FROM 
    (SELECT DISTINCT key FROM table) a, (SELECT DISTINCT value FROM table) b
  )

SELECT 
  kvp.key, 
  kvp.value, 
  COALESCE(base._count, 0) _count 
FROM 
  key_value_pairs kvp
LEFT JOIN 
  table base ON base.key = kvp.key AND base.value = kvp.value;

Mais je présume qu'il peut être plus facile/plus lisible et plus efficace de mettre en œuvre cette -- des suggestions?

sql
2021-11-23 23:43:46
1

La meilleure réponse

1

Vous pouvez utiliser un cross join avec left join pour une solution plus courte:

select t1.key, t2.value, coalesce(t3._count, 0) from tbl t1 
cross join tbl t2 left join tbl t3 on t1.key = t3.key and t2.value = t3.value;
2021-11-23 23:57:34

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................