我有两张 table :
TableA TableB
id id
amt amt
idUser idTableA
假设表 A 中有以下数据:
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,其中 TableA 中只有部分条目与 TableB 有链接(这意味着对于 idUser,TableA 中也必须有一些条目,两个表之间没有链接)在链接的行中,两个表之间至少有一个条目具有不同的金额。
在我的示例中,此类查询将返回 idUser 1,因为 TableA 中的第三个条目满足第一个条件(某些条目没有链接),并且存在金额不同的条目(与值 2 链接)对于 idTableA,表 A 中的数量为 20,表 B 中的数量为 21)
不会返回 userId 2,因为它在两个表之间没有链接行,
userId 3不会被返回,因为它在TableA中没有一行而在TableB中没有链接
userId 4 不会被返回,因为虽然它在 TableA 中有 1 行没有链接,也有 1 行有链接,但有链接的行在 2 个表之间的金额相同。
所以实际上它是两个初始查询的混合......
感谢您的输入,并对基本格式和语言表示歉意,我希望这足够清楚:)
最佳答案
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
关于混合了 LEFT 连接和 INNER 连接的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6391785/