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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top