【问题标题】:SQL server add default value on join where clause if not record exists如果不存在记录,SQL Server 在 join where 子句中添加默认值
【发布时间】:2017-04-21 10:06:41
【问题描述】:

我有以下 SQL 服务器表设置

table1.Id
table1.Name

table2.Id
table2.Type

table1table2 之间存在一对多的关系,例如,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 的记录,如果不存在记录,我想添加一个默认条目。

我认为我可能需要为此使用用例,但无法确切了解如何执行此操作。

我希望我的问题很清楚?

【问题讨论】:

    标签: sql-server join case


    【解决方案1】:

    如果您的条件在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     
    

    【讨论】:

      【解决方案2】:

      你可以试试这个吗? (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
      

      【讨论】:

        【解决方案3】:

        您可以使用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;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-04-22
          • 1970-01-01
          • 2015-07-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多