seleccionar repetidos omitir eliminar elementos duplicados duplicado como sql oracle oracle10g left-join outer-join

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)