Cláusula SQL Select con un compuesto
-
26-10-2019 - |
Pregunta
Tengo dos tablas de búsqueda/referencia (suscritas y no suscribidas) en mi base de datos Microsoft SQL Server 2008 con la siguiente estructura:
UserId int
PublicationId int
Estos campos se indexan juntos como un índice compuesto.
Lo que quiero poder hacer es encontrar todos los registros que existen en la tabla no suscrita que no tienen un registro coincidente en la tabla suscrita (coincidencia de usuario y Publicación)
Funcionalmente, quiero algo como:
select PublicationId, UserId
from Unsubscribed
where PublicationId, UserId not in (
select PublicationId, UserId
from Subscribed
)
¿Alguien puede señalarme en la dirección correcta?
Gracias.
Solución
SELECT PublicationId, UserId
FROM Unsubscribed
MINUS
SELECT PublicationId, UserId
FROM Subscribed
Otros consejos
Puedes usar un left join
para encontrar las publicaciones y usuarios no coincidentes.
SELECT U.[PublicationId], U.[UserId]
FROM [Unsubscribed] AS U
LEFT JOIN [Subscribed] AS S ON S.[PublicationId] = U.[PublicationId]
AND S.[UserId] = U.[UserId]
WHERE S.[PublicationId] IS NULL
AND S.[UserId] IS NULL
O si está utilizando Microsoft SQL Server 2005 /2008, entonces puede usar el Except
palabra clave (use el Intersect
Palabra clave para lo contrario).
SELECT [PublicationId], [UserId]
FROM [Unsubscribed]
EXCEPT
SELECT [PublicationId], [UserId]
FROM [Subscribed]
Siempre puedes convertir IN
a EXISTS
. En su caso, esto se vería así:
select PublicationId, UserId
from Unsubscribed
where
not exists (
select *
from Subscribed
where Subscribed.PublicationId = Unsubscribed.PublicationId
and Subscribed.UserId = Unsubscribed.UserId
)
Por cierto, si está utilizando Oracle, puede implementar su intención original directamente (solo agregue un par de paréntesis):
select PublicationId, UserId
from Unsubscribed
where (PublicationId, UserId) not in (
select PublicationId, UserId
from Subscribed
)
Puedes usar un Se unió a la izquierda lograr esto;
SELECT U.*, S.PublicationId
FROM Unsubscribed U
LEFT JOIN Subscribed S ON U.PublicationId = S.PublicationId AND U.UserId = S.UserId
WHERE S.PublicationId IS NULL
Si eres nuevo en unir Explicación visual de Jeff Atwood es un buen lugar para comenzar.
Efectivamente, lo que la consulta está haciendo es traer de vuelta todas las filas en UBSubscribidas que tienen una fila correspondiente en suscribidas, y todas las filas en suscripción que no tienen filas coincidentes en suscribidas: las filas en suscribidas están representadas con NULL para estos.