Подтвердить что ты не робот

Удалить дубликаты из LEFT OUTER JOIN

Мой вопрос очень похож на Ограничение LEFT JOIN с изменением.

Предполагая, что у меня есть таблица SHOP и другая таблица LOCATION. Местоположение - это своего рода дочерняя таблица таблицы SHOP, которая имеет два столбца, представляющих интерес, один - это ключ раздела (называющий его KEY) и номер "SHOP". Это соответствует номеру "NO" в таблице SHOP.

Я пробовал это левое внешнее соединение:

SELECT S.NO, L.KEY
FROM SHOP S
LEFT OUTER JOIN LOCATN L ON S.NO = L.SHOP

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

Данные верны, но дубликаты выглядят следующим образом:

SHOP     KEY
 1       XXX
 1       XXX
 2       YYY
 3       ZZZ
 3       ZZZ  etc.

Я хотел бы, чтобы данные выглядели следующим образом:

SHOP     KEY
 1       XXX
 2       YYY
 3       ZZZ  etc.

Таблица SHOP:

 NO
 1       
 2       
 3       

Таблица LOCATION:

 LOCATION   SHOP  KEY
   L-1       1    XXX   
   L-2       1    XXX   
   L-3       2    YYY   
   L-4       3    YYY   
   L-5       3    YYY   

(база данных ORACLE 10g)

4b9b3361

Ответ 1

Вам нужно GROUP BY 'S.No' и 'L.KEY'

SELECT S.NO, L.KEY 
FROM SHOP S 
LEFT OUTER JOIN LOCATN L 
ON S.NO = L.SHOP
GROUP BY S.NO, L.KEY

Ответ 2

EDIT После обновления в вашем сценарии

Я думаю, вы должны сделать это с помощью простого подзапроса (хотя я не тестировал его в отношении базы данных Oracle). Что-то вроде следующего

UPDATE shop s
SET divnkey = (SELECT DISTINCT L.KEY FROM LOCATN L WHERE S.NO = L.SHOP)

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

Если вы просто хотите игнорировать эту возможность и выбрать произвольное в этом случае, вы можете использовать

UPDATE shop s
SET divnkey = (SELECT MAX(L.KEY) FROM LOCATN L WHERE S.NO = L.SHOP)

Ответ 3

У меня тоже была эта проблема, но я не мог использовать GROUP BY, чтобы исправить ее, потому что я также возвращал поля типа TEXT. (То же самое касается использования DISTINCT).

Этот код дал мне дубликаты:

select mx.*, case isnull(ty.ty_id,0) when 0 then 'N' else 'Y' end as inuse 
from master_x mx 
left outer join thing_y ty on mx.rpt_id = ty.rpt_id

Я исправил его, переписав его таким образом:

select mx.*, 
case when exists (select 1 from thing_y ty where mx.rpt_id = ty.rpt_id) then 'Y' else 'N' end as inuse
from master_x mx 

Как вы можете видеть, мне не нравились данные во 2-й таблице (thing_y), просто ли было больше нуля в rpt_id внутри него. (FYI: rpt_id также не был первичным ключом в первой таблице, master_x).