Как выбрать записи из двух таблиц, COALESCE Значения, которых нет в Table1 - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть две таблицы со следующими данными:

table1 (palletid, caseshipped, orderid)

palletid   |  (caseshipped)  | orderid
2002057    |    10.00        |  146
2002058    |    50.00        |  146
2002059    |    25.00        |  146
2002058    |    10.00        |  142 

и

table2 (palletid,caseshipping, orderid)

palletid   |  (caseshipping)  |  orderid
2002055    |    0.00          |    146
2002056    |    25.00         |    146
2002057    |    10.00         |    146
2002058    |    50.00         |    146
2002059    |    25.00         |    146
2002060    |    75.00         |    146
2002058    |    10.00         |    142

Результат, ожидаемый от запроса tableresult(DISTINCT(table2.palletid),COALESCE(table1.caseshipped,0), orderid

palletid   |  (caseshipped)  | orderid
2002055    |    0.00         |  146
2002056    |    0.00         |  146
2002057    |    10.00        |  146 
2002058    |    50.00        |  146
2002059    |    25.00        |  146
2002060    |    0.00         |  146

У меня следующий запрос, но я получил один повторный table2.palletid с неправильным table1.caseshipped и неправильным table2.orderid

SELECT DISTINCT table2.palletid, 
COALESCE(table1.caseshipped,0) FROM table2
LEFT JOIN table1 ON table2.palletid=table1.PalletID
WHERE table2.orderid = 146

Результат запроса:

palletid   |  (caseshipped) | orderid
2002055    |    0.00        |   146
2002056    |    0.00        |   146
2002057    |    10.00       |   146
2002058    |    10.00       |   146       Value should not appear(orderid=142)
2002058    |    50.00       |   146       
2002059    |    25.00       |   146
2002060    |    0.00        |   146

Как я могу исправить запрос, чтобы получить ожидаемый результат? Почему я получаю повторный результат?

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

Ответы [ 3 ]

1 голос
/ 12 апреля 2019

В вашем предложении ON отсутствует только одно условие.

SELECT DISTINCT table2.palletid, 
COALESCE(table1.caseshipped,0) FROM table2
LEFT JOIN table1 ON table2.orderID = table1.orderID AND table2.palletid=table1.PalletID
WHERE table2.orderid = 146
0 голосов
/ 12 апреля 2019

Просто добавьте условие соединения в orderid .Ваше объединение в palletid приводит к объединению «многие ко многим», и поэтому вы видите 2 строки, на самом деле это 4 строки (2 для orderid 146, 2 для orderid 142), но поскольку у вас есть фильтр для orderid 146, вы видите только 2 строки,Попробуйте это:

SELECT DISTINCT table2.palletid,
COALESCE(table1.caseshipped,0), table2.orderid FROM table2
LEFT JOIN table1 
  ON table2.palletid=table1.PalletID
  AND table2.orderid = table1.orderid
WHERE table2.orderid = 146
0 голосов
/ 11 апреля 2019

Вы не повторили результат в своем результате. В SQL отдельное предложение работает для каждого значения в строке, а не для одного значения столбца

если вы хотите получить только результат для каждого значения столбца, вы должны использовать функцию группировки по и агрегирования, например min () или max ()

SELECT  table2.palletid, 
max(COALESCE(table1.CaseCount,0)) 
FROM table2
LEFT JOIN table1 ON table2.palletid=table1.PalletID
GROUP BY table2.palletid

при просмотре вашего последнего примера кажется, что вы ищете группу min () по palleid объединения двух таблиц

selet  palletid,  min(caseshipped), orderid
from(
  select  palletid,  caseshipped, orderid
  from table1
  union  
  select  palletid,  caseshipped, orderid
  from table1
) t  
where orderid = 145 
group by palletid 
...