最好的方式在SQL来自加入三个领域表,以便不值得分配的关键和特殊计数

0

的问题

说我们有一个表格:

关键 _count
一个 b 3
c d 2

我们想要扩大这样,每个关键变映为每个不同的价值在表格,并得到一个 _count 0如果关键的价值对有没有没有计数。 例如,用于上表,我谨请参阅:

关键 _count
一个 b 3
一个 d 0
c d 2
c b 0

我有一个工作方案:

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;

但我怀疑有可能是一个更简单的/更具可读性的更高效率的方式执行这一--的任何建议?

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

最好的答案

1

你可以使用 cross joinleft join 对于较短的解决方案:

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

其他语言

此页面有其他语言版本

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