sql: разделение двух таблиц с разными значениями приводит к дублированию результатов - PullRequest
1 голос
/ 09 мая 2019

Я хочу объединить / объединить две таблицы с первичным ключом, категорией и оценкой таким образом, чтобы в результатах были показаны первичный ключ и все категории и оценки, присутствующие в обеих таблицах вместе, и, если данные заданы Категория находится только в одной таблице, затем с нулем для оценки из второй таблицы.

Таблицы следующие: opinion_1

fruit   category    score
apple   color   15
apple   sweet   50
apple   scent   35
orange  color   40
orange  sweet   60

opinion_2

fruit   category    score
apple   color   28
apple   sweet   12
orange  color   29
orange  sweet   50
orange  scent   31

Я пробовал полное внешнее соединение и двойное левое соединение с объединением, получая те же результаты с неправильно умноженными категориями.

WITH opinion_1 AS (
  SELECT 'apple' as fruit, 'color' as category, 15 as score UNION ALL
  SELECT 'apple',   'sweet',    50 UNION ALL
  SELECT 'apple', 'scent',  35 UNION ALL
  SELECT 'orange', 'color', 40 UNION ALL
  SELECT 'orange', 'sweet', 60
), opinion_2 AS (
  SELECT 'apple' as fruit, 'color' as category, 28 as score UNION ALL
  SELECT 'apple',   'sweet',    12 UNION ALL
  SELECT 'orange', 'color', 29 UNION ALL
  SELECT 'orange', 'sweet', 50 UNION ALL
  SELECT 'orange', 'scent', 31
)
SELECT
  opinion_1.fruit,
  opinion_1.category as category,
  opinion_1.score as score1,
  opinion_2.score as score2
FROM opinion_1
full outer join opinion_2
on opinion_1.fruit = opinion_2.fruit

Ожидаю следующий результат операции:

fruit   category    score1  score2
apple   color   15  28
apple   sweet   50  12
apple   scent   35  null
orange  color   40  29
orange  sweet   60  50
orange  scent   null    31

но я получаю это:

fruit   category    score1  score2
apple   color   15  12
apple   color   15  28
apple   sweet   50  12
apple   sweet   50  28
apple   scent   35  12
apple   scent   35  28
orange  color   40  50
orange  color   40  31
orange  color   40  29
orange  sweet   60  50
orange  sweet   60  31
orange  sweet   60  29

Ответы [ 2 ]

2 голосов
/ 09 мая 2019

Я думаю, что вы не выполнили условие в своем объединении, чтобы получить ожидаемый результат.Более того, выбор opinion_1.fruit и opinion_1.category приведет к появлению нулей, если нет записей для какого-либо фрукта на мнение_1, в то время как есть на мнение_2.Следующий запрос даст ожидаемый результат:

WITH opinion_1 AS (
  SELECT 'apple' as fruit, 'color' as category, 15 as score UNION ALL
  SELECT 'apple',   'sweet',    50 UNION ALL
  SELECT 'apple', 'scent',  35 UNION ALL
  SELECT 'orange', 'color', 40 UNION ALL
  SELECT 'orange', 'sweet', 60
), opinion_2 AS (
  SELECT 'apple' as fruit, 'color' as category, 28 as score UNION ALL
  SELECT 'apple',   'sweet',    12 UNION ALL
  SELECT 'orange', 'color', 29 UNION ALL
  SELECT 'orange', 'sweet', 50 UNION ALL
  SELECT 'orange', 'scent', 31
)
SELECT
  coalesce(opinion_1.fruit, opinion_2.fruit) as fruit,
  coalesce(opinion_1.category, opinion_2.category) as category,
  opinion_1.score as score1,
  opinion_2.score as score2
FROM opinion_1
full outer join opinion_2
on opinion_1.fruit = opinion_2.fruit and opinion_1.category = opinion_2.category
1 голос
/ 09 мая 2019

Ниже для BigQuery Standard SQL

#standardSQL
WITH opinion_1 AS (
  SELECT 'apple' AS fruit, 'color' AS category, 15 AS score UNION ALL
  SELECT 'apple',   'sweet',    50 UNION ALL
  SELECT 'apple', 'scent',  35 UNION ALL
  SELECT 'orange', 'color', 40 UNION ALL
  SELECT 'orange', 'sweet', 60
), opinion_2 AS (
  SELECT 'apple' AS fruit, 'color' AS category, 28 AS score UNION ALL
  SELECT 'apple',   'sweet',    12 UNION ALL
  SELECT 'orange', 'color', 29 UNION ALL
  SELECT 'orange', 'sweet', 50 UNION ALL
  SELECT 'orange', 'scent', 31
)
SELECT
  IFNULL(a.fruit, b.fruit) fruit,
  IFNULL(a.category, b.category) AS category,
  a.score AS score1,
  b.score AS score2
FROM opinion_1 a
FULL OUTER JOIN opinion_2 b
USING(fruit, category)   

с результатом

Row fruit   category    score1  score2   
1   apple   color       15      28   
2   apple   sweet       50      12   
3   apple   scent       35      null     
4   orange  color       40      29   
5   orange  sweet       60      50   
6   orange  scent       null    31   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...