我有以下SQL服务器表设置
table1.Id
table1.Name
table2.Id
table2.Type
table1
和table2
之间存在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的记录,如果不存在记录,我想添加默认条目
我想我可能需要为此使用案例,但无法确切地知道如何执行此操作。
我希望我的问题很清楚?
答案 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;