Лучший способ в SQL самостоятельно объединить таблицу с тремя полями, чтобы ключам без значений присваивался ключ и определенное количество

0

Вопрос

Скажем, у нас есть столик:

Клавиша ценность _счет
a b 3
c d 2

что мы хотим развернуть так, чтобы каждый ключ сопоставлялся с каждым отдельным значением в таблице и получал _count 0, если у пары ключ-значение еще не было счетчика. Например, для приведенной выше таблицы я хотел бы видеть:

Клавиша ценность _счет
a b 3
a 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 join с left 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ý
..................................................................................................................

Популярное в этой категории

Популярные вопросы в этой категории