SQL:如何获取匹配和不匹配的记录

标签 sql sql-server join

我有一个包含以下字段的表。

  1. 订单ID
  2. 项目ID

我的表有以下条目。

enter image description here

我想比较两个 OrderId 并获得结果,以了解两个 Order 中存在哪些 ItemId,哪些不存在。

我需要的结果如下。

enter image description here

两个订单中都存在 ItemId:200。

ItemId:201 存在于 100 中,而不存在于 101 中

ItemId:202 和 203 存在于 101 中,而不存在于 100 中。

我不确定这是否可以通过 SQL 来完成。

如有任何帮助,我们将不胜感激。提前致谢。

用于测试的 SQL 脚本:

创建表#Orders(OrderId INT, ItemId INT) 插入#Orders 选择 100、200 插入#Orders 选择 100、201 插入#Orders 选择 101、200 插入#Orders 选择 101、202 插入#Orders 选择 101, 203

最佳答案

您需要执行CROSS JOIN,然后执行LEFT JOIN来检查可用性。

当您有多个订单和商品时,您想要的输出并不是最好的检查方式,以下输出应该足够了:

;WITH AllOrders AS
(
    SELECT DISTINCT O.OrderID FROM #Orders AS O
),
AllItems AS
(
    SELECT DISTINCT O.ItemId FROM #Orders AS O
)
SELECT
    OrderId = O.OrderId,
    ItemId = I.ItemId,
    IsItemInOrder = CASE WHEN A.OrderId IS NOT NULL THEN 1 ELSE 0 END
FROM
    AllOrders AS O
    CROSS JOIN AllItems AS I
    LEFT JOIN #Orders AS A ON
        O.OrderId = A.OrderId AND
        I.ItemId = A.ItemId
ORDER BY
    O.OrderId,
    I.ItemId

结果:

OrderId ItemId  IsItemInOrder
100     200     1
100     201     1
100     202     0
100     203     0
101     200     1
101     201     0
101     202     1
101     203     1

关于SQL:如何获取匹配和不匹配的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54670387/

相关文章:

sql-server - 如何使用 SMO 脚本生成器生成 sql 脚本

sql - 对多个表进行联接和逆透视

java - Hibernate/JPA JPQL 在查询 Map<String,String> 字段时出现错误的 SQL

sql-server - SQL 服务器 : Case with the statement "NOT IN"

sql - 如何在添加到项目中的 SQL Server Express 数据库中创建用户?

asp.net - 更改数据库密码和避免网站停机的流程

ruby-on-rails - rails 4 中的多级连接

node.js - Sequelize连接和关系

mysql - 如何在 MYSQL 中获取特定月份的不同登录信息?

sql - 使用 row_to_json 的 Postgres 递归查询