ISNULL在where语句提供不同的第二个Left Outer Join值

时间:2014-08-26 18:50:48

标签: sql left-join isnull

在SQL Server中,当我尝试将数据放入变量但在where语句中的第二个左外连接值周围有一个ISNULL而不是提供预期结果时,它只返回最后一行"行"数据的。在下面的示例中,您可以更详细地了解我的意思。

第一个输出将显示通用输出,6行数据。第二个输出将显示我只获取@VAR中的最后一行数据。第三个输出将告诉你如果我从Order by语句中的FRUIT_COLOR_yellow.NAME中删除ISNULL,我将所有6行连接在一起(这是我认为我也会得到第二个输出)。

我想了解为什么第二个输出返回它的原因。我错过了什么?

我真的只想知道为什么@VAR与@ VAR2不同。现实生活中的例子就是我正在构建一个HTML表格(这就是我在这个方法中连接的原因)我希望通过更像COALESCE(FRUIT_COLOR_ORANGE.name,FRUIT_COLOR_YELLOW.NAME,'&# 39)。那并没有返回我期待的行数,因此我试图追踪问题,以及当第二个左外连接的order by语句中有一个ISNULL时的问题。

IF OBJECT_ID('FRUIT') IS NOT NULL
DROP TABLE FRUIT;
GO

CREATE TABLE FRUIT (
name VARCHAR(25),
color INT
);
GO

IF OBJECT_ID('FRUIT_COLOR') IS NOT NULL
DROP TABLE FRUIT_COLOR;
GO

CREATE TABLE FRUIT_COLOR
(
id INT,
name VARCHAR(25)
);
GO


INSERT into FRUIT_COLOR VALUES (1,'orange');
INSERT into FRUIT_COLOR VALUES(2,'yellow');
INSERT into FRUIT_COLOR VALUES (3,'red');
INSERT into FRUIT_COLOR VALUES (4,'blue');
GO

INSERT into FRUIT VALUES ('banana',2);
INSERT into FRUIT VALUES ('mango',2);
INSERT into FRUIT VALUES ('orange',1);
INSERT into FRUIT VALUES ('apple',3);
INSERT into FRUIT VALUES ('grapes',null);
INSERT into FRUIT VALUES ('avocado',null);
GO

--Test Control - 6 rows of data
SELECT ISNULL(FRUIT.NAME,'') + ' ' + ISNULL(FRUIT_COLOR_ORANGE.NAME, 'NOT ORANGE ') +  ISNULL(FRUIT_COLOR_yellow.NAME, 'NOT YELLOW ')
FROM FRUIT 
    LEFT OUTER JOIN FRUIT_COLOR FRUIT_COLOR_ORANGE ON FRUIT.COLOR = FRUIT_COLOR_ORANGE.ID
        AND FRUIT_COLOR_ORANGE.NAME = 'Orange'
    LEFT OUTER JOIN FRUIT_COLOR FRUIT_COLOR_yellow ON FRUIT.COLOR = FRUIT_COLOR_yellow.ID
        AND FRUIT_COLOR_yellow.NAME = 'yellow'              
ORDER BY FRUIT_COLOR_ORANGE.name    
    ,ISNULL(FRUIT_COLOR_yellow.NAME, 'test')


DECLARE @VAR varchar(MAX)
SET @VAR = ''   

--When I attempt to put this to a variable it only shows the last row of data
SELECT @VAR = ISNULL(@VAR, '') + ISNULL(FRUIT.NAME,'') + ' ' + ISNULL(FRUIT_COLOR_ORANGE.NAME, 'NOT ORANGE ') +  ISNULL(FRUIT_COLOR_yellow.NAME, 'NOT YELLOW ')
FROM FRUIT 
    LEFT OUTER JOIN FRUIT_COLOR FRUIT_COLOR_ORANGE ON FRUIT.COLOR = FRUIT_COLOR_ORANGE.ID
        AND FRUIT_COLOR_ORANGE.NAME = 'Orange'
    LEFT OUTER JOIN FRUIT_COLOR FRUIT_COLOR_yellow ON FRUIT.COLOR = FRUIT_COLOR_yellow.ID
        AND FRUIT_COLOR_yellow.NAME = 'yellow'              
ORDER BY FRUIT_COLOR_ORANGE.name    
    ,ISNULL(FRUIT_COLOR_yellow.NAME, 'test')    

SELECT @VAR 

DECLARE @VAR2 varchar(MAX)
SET @VAR2 = ''  
--If I remove the ISNULL from FRUIT_COLOR_yellow.NAME in the order by clause I get all 6 results concatonated as I would expect
SELECT @VAR2 = ISNULL(@VAR2, '') + ISNULL(FRUIT.NAME,'') + ' ' + ISNULL(FRUIT_COLOR_ORANGE.NAME, 'NOT ORANGE ') +  ISNULL(FRUIT_COLOR_yellow.NAME, 'NOT YELLOW ')
FROM FRUIT 
    LEFT OUTER JOIN FRUIT_COLOR FRUIT_COLOR_ORANGE ON FRUIT.COLOR = FRUIT_COLOR_ORANGE.ID
        AND FRUIT_COLOR_ORANGE.NAME = 'Orange'
    LEFT OUTER JOIN FRUIT_COLOR FRUIT_COLOR_yellow ON FRUIT.COLOR = FRUIT_COLOR_yellow.ID
        AND FRUIT_COLOR_yellow.NAME = 'yellow'              
ORDER BY FRUIT_COLOR_ORANGE.name    
    ,FRUIT_COLOR_yellow.NAME    

SELECT @VAR2    

0 个答案:

没有答案