我有两张桌子:
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个表之间的数量相同。
所以真的是两个初始查询的混合...
感谢您的投入和对基本格式和语言的道歉,我希望这很清楚:)
答案 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;
我不确定这实际上是否更有效,但这就是我将如何做到的。