И ПОЛНОСТЬЮ ВСТУПИТЬ И ГДЕ получить истинный результат? - PullRequest
2 голосов
/ 04 мая 2011

Я написал этот скрипт.если мы прокомментируем две части в предложении 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

1 Ответ

3 голосов
/ 04 мая 2011

Может кто-нибудь сказать мне, почему?

Потому что так работает 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...