SQL查询,它是LEFT联接和INNER联接的混合

时间:2011-06-17 20:59:53

标签: sql sql-server database

我有两张桌子:

TableA        TableB
id            id
amt           amt
idUser        idTableA

假设以下数据在TableA中:

1   10  1
2   20  1
3   30  1
4   40  2
5   50  3
6   60  4
7   70  4

以下数据在表B中:

1   10  1
2   20  2
3   21  2
4   51  5
5   70  7

所有字段都不可为空。

如果我想知道TableA中的哪些项目没有与tableB的“链接”(通过TableB.idTableA字段),我可以执行以下查询:

SELECT a.id, a.amt
FROM TableA a LEFT JOIN TableB b on b.idTableA = a.id
WHERE b.idTableA IS NULL

它将返回以下内容:

3   30
4   40
6   60

如果我想知道TableA中有哪些项目(有一个指向tableB的链接),我可以在每个表中使用amt值不相同:

SELECT a.id, a.amt, b.amt
FROM TableA a INNER JOIN TableB b on b.idTableA = a.id
WHERE a.amt <> b.amt

它会返回:

2   20  21
5   50  51

现在,我想要一个执行以下操作的查询: 返回idUsers,其中只有一些其表中的条目与TableB有链接(意味着对于idUser,TableA中也必须有一些条目,两个表之间没有链接)和其中至少有一个条目在链接的行中的两个表之间具有不同的金额。

在我的示例中,idUser 1将由此类查询返回,因为TableA中的第三个条目满足第一个条件(某些条目没有链接)并且存在一个金额不同的条目(与值2链接)对于idTableA,表A中的金额为20,表B中为21,

不会返回

userId 2,因为它没有在两个表之间链接的行

不会返回

userId 3,因为TableA中没有一行没有TableB中的链接

不会返回

userId 4,因为虽然TableA中有1行没有链接,1行也有链接,但带有链接的行在2个表之间的数量相同。

所以真的是两个初始查询的混合...

感谢您的投入和对基本格式和语言的道歉,我希望这很清楚:)

2 个答案:

答案 0 :(得分:4)

with loners as (
SELECT a.*
FROM TableA a 
LEFT JOIN TableB b on b.idTableA = a.id
WHERE b.idTableA IS NULL
), 
diffs as (
SELECT a.*
FROM TableA a 
INNER JOIN TableB b on b.idTableA = a.id
WHERE a.amt <> b.amt
)
select loners.userID
FROM loners
INNER JOIN diffs on LONERS.userID = DIFFS.userID

答案 1 :(得分:1)

SELECT a.idUser
FROM
(SELECT a2.id, a2.amt, a2.idUser 
    FROM TableA AS a2 
    LEFT JOIN TableB AS b2 
    ON b2.idTableA = a2.id 
    WHERE b2.idTableA IS NULL
) AS a 
INNER JOIN TableB AS b
ON b.idTableA = a.id
WHERE a.amt <> b.amt;

我不确定这实际上是否更有效,但这就是我将如何做到的。