如果不存在记录,SQL服务器在join where子句中添加默认值

时间:2017-04-21 10:06:42

标签: sql-server join case

我有以下SQL服务器表设置

table1.Id
table1.Name

table2.Id
table2.Type

table1table2之间存在1对多的关系,例如table2中有许多记录可以链接到table1中的单个记录。

我现在有以下数据集:

table1  
Id  Name
1   Name1
2   Name2

table2  
Id  Type
1   1
1   2
2   1

我现在运行以下查询:

SELECT *
FROM table1 t
LEFT JOIN table2 l
ON t.Id = l.Id
WHERE l.Type = 2

此查询将返回以下内容:

table1      table2  
Id  Name    Id  Type
1   Name1   1   2

我实际想要实现的是一个将返回以下内容的查询:

table1      table2  
Id  Name    Id  Type
1   Name1   1   2
2   Name2   1   DEFAULTVALUE

我宣布DEFAULTVALUE。

我知道如果删除WHERE子句,查询将返回3行,但我想排除所有不具有类型2的记录,如果不存在记录,我想添加默认条目

我想我可能需要为此使用案例,但无法确切地知道如何执行此操作。

我希望我的问题很清楚?

3 个答案:

答案 0 :(得分:3)

如果你的情况在left join表中,你可以把它放在left join条款中

SELECT  ISNULL(l.Type, 'Default Value') as Type
FROM table1 t
LEFT JOIN table2 l
ON t.Id = l.Id and l.Type = 2     

答案 1 :(得分:1)

你能试试吗? (L.ID将为NULL,而不是预期输出中的1):

SELECT T.ID, T.NAME, L.ID, COALESCE(L.TYPE, 'DEFAULTVALUE') AS TYPE
FROM table1 t
LEFT JOIN (SELECT * FROM table2 WHERE Type = 2) l ON t.Id = l.Id

答案 2 :(得分:1)

您可以使用CASE语句设置默认值。您可以独立于数据运行以下示例进行测试:

CREATE TABLE #table1 ( id INT, name VARCHAR(10) );

CREATE TABLE #table2 ( id INT, [type] INT );

INSERT  INTO #table1
        ( id, name )
VALUES  ( 1, 'Name1' ),
        ( 2, 'Name2' );

INSERT  INTO #table2
        ( id, type )
VALUES  ( 1, 1 ),
        ( 1, 2 ),
        ( 2, 1 );

DECLARE @TYPE INT = 2 ,
    @DEFAULT INT = 99;

SELECT  t.id ,
        t.name ,
        l.id ,
        CASE WHEN l.type = @TYPE THEN l.type
             ELSE @DEFAULT
        END AS [Type]
FROM    #table1 t
        LEFT JOIN #table2 l ON t.id = l.id
WHERE   t.id IN ( SELECT    id
                  FROM      #table2
                  WHERE     type = @TYPE );

DROP TABLE #table1;
DROP TABLE #table2;