gpt4 book ai didi

sql-server - FULL OUTER JOIN 和 WHERE 获得真实结果?

转载 作者:行者123 更新时间:2023-12-04 06:27:22 26 4
gpt4 key购买 nike

我写了这个脚本。如果我们在 WHERE 子句中注释这两部分,结果中会忽略一些行。有人能告诉我为什么吗?

在第一个查询中,它作为 FULL OUTER JOIN 工作,但在第二个查询中,查询结果为 INNER JOIN 并只返回一行,尽管使用了 WHERE 子句来解决 UNKNOWN 条件。

DECLARE @ALLDATA TABLE 
(
[Id] INT,
[T3Id] INT,
[StockId] INT,
[Serial] INT,
[ISDel] INT
)
INSERT INTO @ALLDATA ([Id],[T3Id],[StockId],[Serial],[ISDel])
Select 5 AS [Id],11 AS [T3Id],5 AS [StockId],0 AS [Serial],1 AS [ISDel]
UNION ALL
Select 1 AS [Id],11 AS [T3Id],5 AS [StockId],0 AS [Serial],1 AS [ISDel]
UNION ALL
Select 1 AS [Id],11 AS [T3Id],5 AS [StockId],1 AS [Serial],-1 AS [ISDel]
UNION ALL
Select 2 AS [Id],11 AS [T3Id],5 AS [StockId],2 AS [Serial],-1 AS [ISDel]
UNION ALL
Select 3 AS [Id],11 AS [T3Id],5 AS [StockId],3 AS [Serial],-1 AS [ISDel]
UNION ALL
Select 4 AS [Id],11 AS [T3Id],5 AS [StockId],4 AS [Serial],-1 AS [ISDel]

SELECT 'WITH CONDITIONS:'

SELECT
ISNULL(DataIns.[Id],DataDEL.[Id]) AS [Id]
,ISNULL(DataDEL.[StockId],-1) AS [OLDStockId]
,ISNULL(DataDEL.[Serial],0) AS [OLDSerial]
,ISNULL(DataIns.[StockId],-1) AS [NEWStockId]
,ISNULL(DataIns.[Serial],0) AS [NEWSerial]
,ISNULL(DataIns.[T3Id],DataDEL.[T3Id]) AS [T3Id]
,DataIns.[ISDel] AS [ISDel1]
,DataDEL.[ISDel] AS [ISDel2]
FROM @ALLDATA AS DataIns
FULL OUTER JOIN @ALLDATA AS DataDEL
ON
DataDEL.Id = DataIns.Id
AND
DataDEL.ISDel = 1
AND
DataIns.ISDel = -1
WHERE ISNULL(DataDEL.[ISDel],1) = 1 AND ISNULL(DataIns.[ISDel],-1) = -1

SELECT 'WITHOUT CONDITIONS:'

SELECT
ISNULL(DataIns.[Id],DataDEL.[Id]) AS [Id]
,ISNULL(DataDEL.[StockId],-1) AS [OLDStockId]
,ISNULL(DataDEL.[Serial],0) AS [OLDSerial]
,ISNULL(DataIns.[StockId],-1) AS [NEWStockId]
,ISNULL(DataIns.[Serial],0) AS [NEWSerial]
,ISNULL(DataIns.[T3Id],DataDEL.[T3Id]) AS [T3Id]
,DataIns.[ISDel] AS [ISDel1]
,DataDEL.[ISDel] AS [ISDel2]
FROM @ALLDATA AS DataIns
FULL OUTER JOIN @ALLDATA AS DataDEL
ON
DataDEL.Id = DataIns.Id
--AND
-- DataDEL.ISDel = 1
--AND
-- DataIns.ISDel = -1
WHERE ISNULL(DataDEL.[ISDel],1) = 1 AND ISNULL(DataIns.[ISDel],-1) = -1

期望输出:
1    5  0    5  1   11    -1       1
2 -1 0 5 2 11 -1 NULL
3 -1 0 5 3 11 -1 NULL
4 -1 0 5 4 11 -1 NULL
5 5 0 -1 0 11 NULL 1

最佳答案

Can somebody tell me why?



因为是这样 FULL OUTER JOIN作品。

当您注释掉 ON 中的附加条件时条款,你实际上得到了一个 INNER JOIN (因为 id 将始终在自联接中产生至少一个匹配项)。

您的第一个查询对我来说也没有意义(或者您有一些非常复杂的要求)。

我相信你想要这个:
SELECT   ISNULL(DataIns.[Id],DataDEL.[Id])      AS [Id]
,ISNULL(DataDEL.[StockId],-1) AS [OLDStockId]
,ISNULL(DataDEL.[Serial],0) AS [OLDSerial]
,ISNULL(DataIns.[StockId],-1) AS [NEWStockId]
,ISNULL(DataIns.[Serial],0) AS [NEWSerial]
,ISNULL(DataIns.[T3Id],DataDEL.[T3Id]) AS [T3Id]
,DataIns.[ISDel] AS [ISDel1]
,DataDEL.[ISDel] AS [ISDel2]
FROM (
SELECT *
FROM @alldata
WHERE isdel = 1
) dataDel
FULL JOIN
(
SELECT *
FROM @alldata
WHERE isdel = -1
) dataIns
ON dataDel.id = dataIns.id

关于sql-server - FULL OUTER JOIN 和 WHERE 获得真实结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5883355/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com