混合了 LEFT 连接和 INNER 连接的 SQL 查询

标签 sql sql-server database

我有两张 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/

相关文章:

php - 删除多个字段失败

sql - 如何在此查询中获取每一天的 MAX(Hour) 和 The MIN(Hour)?

sql-server - 在 SQL Server 中获取用户名的 DDL 触发器

sql-server - 将6000个表和数据从sql server复制到oracle ==>最快的方法?

sql - 了解 Azure SQL Server 外部表

database - 我应该在查询中使用 "maxrows"吗?冷融合/SQL

android - 在其中添加对象后, Realm 对象不更新

sql - 是否可以 O(1) 访问数据库行?

mysql - 现有关键字无效

mysql - sql插入并检查输入值不为空