tsql - 完全外部自联接

标签 tsql

这个问题在这里已经有了答案:





SQL Full Outer Join on same column in same table

(1 个回答)


8年前关闭。




问题是返回包含空值的行。下面是用于创建表并用示例数据填充它的 SQL 代码。

我在下面期待,但查询没有显示具有空值的两行。

src_t1  id1_t1  id2_t1  val_t1     src_t2  id1_t2  id2_t2  val_t2

                                        b       z      z        4
a        w       w      100             b       w      w        1
a        x       x      200             b       x      x        2
a        y       y      300

Data:

CREATE TABLE sample (
    src VARCHAR(6)
    ,id1 VARCHAR(6)
    ,id2 VARCHAR(6)
    ,val FLOAT
);

INSERT INTO sample (src, id1, id2, val)
VALUES ('a', 'w', 'w', 100)
      ,('b', 'w', 'w', 1) 
      ,('a', 'x', 'x', 200)
      ,('b', 'x', 'x', 2) 
      ,('a', 'y', 'y', 300)
      ,('b', 'z', 'z', 4) 
;

这是我的测试查询。当 t1.src = 'a' 和 t1.id1 = 'y' 或 t2.src = 'b' 和 t2.id1 = 'z' 时,它不显示结果。

为什么?

什么是正确的查询?
SELECT t1.src, t1.id1, t1.id2, t1.val
  ,t2.src as src2, t2.id1, t2.id2, t2.val
FROM sample t1 FULL OUTER JOIN sample t2
  ON t1.id1 = t2.id1 AND t1.id2 = t2.id2
WHERE (t1.src = 'a' AND t2.src = 'b') 
  OR (t1.src IS NULL AND t1.id1 IS NULL AND t1.id2 IS NULL)
  OR (t2.src IS NULL AND t2.id1 IS NULL AND t2.id2 IS NULL)

我也试过在 WHERE 中移动条件条款给 ON条款也是如此。

TIA。

最佳答案

WHERE 子句评估太晚,有效地将您的查询转换为内部联接。

相反,使用正确的 JOIN 语法编写这样的查询:

SELECT t1.src, t1.id1, t1.id2, t1.val
  ,t2.src as src2, t2.id1, t2.id2, t2.val
FROM (
    select * from sample
    where src='a'
) t1 FULL OUTER JOIN (
    select * from sample 
    where src='b'
)  t2
  ON t1.id1 = t2.id1 AND t1.id2 = t2.id2

产生这个结果集:
src  id1  id2  val         src2 id1  id2  val
---- ---- ---- ----------- ---- ---- ---- -----------
a    w    w    100         b    w    w    1
a    x    x    200         b    x    x    2
NULL NULL NULL NULL        b    z    z    4
a    y    y    300         NULL NULL NULL NULL

更新 :
还要注意使用两个子查询将源表清楚地分成两个不同的相关变量。我第一次提交时错过了这一分钟。

关于tsql - 完全外部自联接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17252719/

相关文章:

tsql - T-SQL 中的形状查询

sql-server - 统计Sql服务器中的事件?

sql-server - 如何有效地对包含数字和字母的 nvarchar 进行排序?

.net - 在 SQL 或 LINQ 查询中对链表结构进行排序?

sql-server - 为什么在 RETURN 后查询继续执行?

SQL Server 需要很长时间才能对几行执行更新查询

.net - 我可以从 .NET 运行 DBCC CHECKDB 吗?

tsql - 满足 SQL Server 2008 第一天标准

sql - TSQL 尝试清理杂乱的字符串字段并将其转换为小数以执行 SUM 函数

sql-server - 当未指定时,SQL Server 如何确定转换的样式?