sql - 如何返回匹配 JOIN 条件某些部分的数据,几乎像 FULL OUTER JOIN?

标签 sql sql-server tsql

这就是我想弄清楚的。假设我有两个数据集,我试图通过将它们连接在一起并将它们并排放置并查看差异来进行比较:

Table1
Name       Description       Style          Cost
Chair-1    Simple Chair      Contemporary   $100

Table2
Name       Description       Style          Cost
Chair-1    Simple Chair      Modern         $150 

I would write some SQL like this:

SELECT T1.Name, T1.Description, T1.Style, T1.Cost
T2.Name, T2.Description, T2.Style, T2.Cost
FROM Table1 T1
FULL OUTER JOIN Table2 T2
ON T1.Name = T2.Name
AND T1.Description = T2.Description
AND T1.Style = T2.Style
--WHERE T1.Cost <> T2.Cost

但是,结果集会给我 2 条记录,T1 记录的 T2 字段中为 NULL,T2 记录的 T1 字段中为 NULL,因为它们不完全匹配。

我的问题是:如果这两个数据集在某些字段上匹配但不是全部匹配,是否有任何方法可以将它们并排显示?我尝试使用 FULL OUTER JOIN 来执行此操作,但它们仍然必须匹配 JOIN 条件中的所有字段。

例如,由于上面的两条记录具有相同的名称和描述但样式不同,我希望将它们连接在一起,因为它们符合 3 个条件中的 2 个。

我会在 SQL Server 2016 上运行它。

编辑:我认为这可能是 OUTER APPLY 的一个用例,但我不完全确定。我重写了我的代码,看起来像这样(这个例子都是伪代码):

SELECT T1.Name, T1.Description, T1.Style, T1.Cost
T2.Name, T2.Description, T2.Style, T2.Cost
FROM Table1 T1
OUTER APPLY 
(
SELECT T2.Name, T2.Description, T2.Style, T2.Cost
FROM Table2 T2
WHERE T1.Name = T2.Name
AND T1.Description = T2.Description
AND T1.Style = T2.Style
--AND T1.Cost <> T2.Cost --This is what I'm looking for ultimately
) T2

我对 OUTER APPLY 将返回符合最匹配条件的记录的理解是否正确?

最佳答案

您可以使用OR 进行连接。

SELECT T1.Name, T1.Description, T1.Style, T1.Cost
       T2.Name, T2.Description, T2.Style, T2.Cost
FROM Table1 T1 FULL OUTER JOIN
     Table2 T2
     ON T1.Name = T2.Name OR
        T1.Description = T2.Description OR
        T1.Style = T2.Style

如果 3 列中的任何 1 列匹配,这将为您提供结果。可以结合使用 ANDOR 来匹配 3 列中的 2 列。

示例:

(T1.Name = T2.Name AND T1.Description = T2.Description)
OR (T1.Description = T2.Description AND T1.Style = T2.Style)
OR (T1.Name = T2.Name AND T1.Style = T2.Style)

关于sql - 如何返回匹配 JOIN 条件某些部分的数据,几乎像 FULL OUTER JOIN?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49680667/

相关文章:

SQL 按客户端位置分组

sql-server - MS SQL Server NTEXT 到 INT

SQL Server - 选择同一列的两个不同范围内的值的行

tsql - 在内存优化表上使用索引

sql-server - 使用 .fmt 文件批量插入 : Operating system error code (null)

tsql - 在 TSQL UPDATE 中使用 IF 语句

PHP - 在数组中使用标签而不是索引

sql - LINQ to SQL 设计器错误

php - 如何改进 MySQL 中的 IF 语句?

mysql - 如何使用 JOIN 而不是逗号?