Ответ 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
Мой вопрос очень похож на Ограничение 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)
Вам нужно 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
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)
У меня тоже была эта проблема, но я не мог использовать 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
).