eliminar - sql omitir repetidos
Eliminar los duplicados de la UNIÓN EXTERIOR IZQUIERDA (3)
Mi pregunta es bastante similar a Restringir una CONEXIÓN IZQUIERDA , con una variación.
Suponiendo que tengo una tabla SHOP y otra tabla UBICACIÓN. La ubicación es un tipo de tabla secundaria de la tabla SHOP, que tiene dos columnas de interés, una es una Clave de división (llamándola simplemente CLAVE) y un número de "COMPRA". Esto coincide con el número "NO" en la tabla COMPRAR.
Intenté esta unión externa izquierda:
SELECT S.NO, L.KEY
FROM SHOP S
LEFT OUTER JOIN LOCATN L ON S.NO = L.SHOP
pero estoy obteniendo muchos duplicados ya que hay muchas ubicaciones que pertenecen a una sola tienda. Quiero eliminarlos y simplemente obtener una lista de entradas de "compra, clave" sin duplicados.
Los datos son correctos pero los duplicados aparecen como sigue:
SHOP KEY
1 XXX
1 XXX
2 YYY
3 ZZZ
3 ZZZ etc.
Me gustaría que los datos aparezcan así en su lugar:
SHOP KEY
1 XXX
2 YYY
3 ZZZ etc.
Tabla de compras:
NO
1
2
3
Tabla de ubicación:
LOCATION SHOP KEY
L-1 1 XXX
L-2 1 XXX
L-3 2 YYY
L-4 3 YYY
L-5 3 YYY
(Base de datos ORACLE 10g)
Necesitas agrupar por ''S.No'' y ''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
También tuve este problema, pero no pude usar GROUP BY para solucionarlo porque también estaba devolviendo campos de tipo TEXTO. (Lo mismo ocurre con el uso de DISTINCT).
Este código me dio duplicados:
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
Lo arreglé reescribiéndolo así:
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
Como puede ver, no me importaron los datos dentro de la 2ª tabla ( thing_y
), solo si hubo más de cero coincidencias en el rpt_id
dentro de ella. (Para su información: rpt_id
tampoco fue la clave principal en la primera tabla, master_x
).
EDITAR Tras la actualización en su escenario
Creo que debería poder hacer esto con una sub consulta simple (aunque no lo he probado con una base de datos Oracle). Algo como lo siguiente
UPDATE shop s
SET divnkey = (SELECT DISTINCT L.KEY FROM LOCATN L WHERE S.NO = L.SHOP)
Lo anterior generará un error en el caso de que una tienda esté asociada con ubicaciones que se encuentran en varias divisiones.
Si solo desea ignorar esta posibilidad y seleccionar una arbitraria en ese caso, podría usar
UPDATE shop s
SET divnkey = (SELECT MAX(L.KEY) FROM LOCATN L WHERE S.NO = L.SHOP)