查询连接存在匹配的两个表,如果ID存在于另一个表中,则删除结果

时间:2014-11-14 20:55:08

标签: sql sql-server tsql join

此查询通过将存在相互匹配的两个表连接在一起来获取ID,名字,出生日期

相互匹配的例子:

艾米喜欢玛丽

玛丽喜欢艾米

SELECT u.ID, u.firstname, u.dob, i.[Image]
FROM   [dbo].[User] AS u
          INNER JOIN [dbo].[Images] AS i ON u.ID = i.Id
WHERE  u.ID IN (
         SELECT userB FROM   [dbo].[LikesRefined]
         WHERE  userA = @ID OR userB = @ID
       UNION
         SELECT userB FROM   [dbo].[LikesRefined]
         WHERE  userA = @ID OR userB = @ID
);

我想通过在另一个表上使用except子句来过滤此结果,但我一直收到此错误

使用UNION,INTERSECT或EXCEPT运算符组合的所有查询在目标列表中必须具有相同数量的表达式。

except
(select paidA
from [dbo].[Matches]
WHERE paidA = @ID
AND (userA = @ID or userB = @ID))
end

2 个答案:

答案 0 :(得分:0)

我仍然感到困惑,但我认为这可能会有所帮助:

SELECT  u.ID ,
        u.firstname ,
        u.dob ,
        i.[Image]
FROM    [dbo].[User] AS u
        INNER JOIN [dbo].[Images] AS i ON u.ID = i.Id
        INNER JOIN dbo.[LikesRefined] lr ON (u.ID = lr.userA OR u.ID = lr.userB)
        LEFT OUTER JOIN dbo.Matches m ON u.ID = m.paidA
                                         AND ( m.userA = u.ID OR m.userb = u.ID )
WHERE   (lr.userA = @ID OR lr.userB = @ID)
        AND m.paidA IS NULL

我们摆脱了union运算符,只需在LikeRefined表中的userA或userB中检查ID。然后我们离开加入dbo.Matches并只查找没有匹配的记录。

答案 1 :(得分:-1)

使用union运算符时,所有select语句必须具有相同的列数