Я написал этот скрипт.если мы прокомментируем две части в предложении WHERE, некоторые строки будут игнорироваться в результате.Может кто-нибудь сказать мне, почему?
В первом запросе он работает как FULL OUTER JOIN, но во втором запросе результат INNER JOIN и возвращает только одну строку, несмотря на использование предложения WHERE, в которомусловие НЕИЗВЕСТНО разрешается.
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