我的表格设置如下:
Table 1:
ID Name Date
1 a 2000-01-01
2 b 2001-01-01
3 c 2002-01-01`
Table 2:
ID Name
2 b
3 c
我想在表1中返回所有内容,然后有一个列,其中包含一个'是'的变量。或者'否',基于它们是否存在于表2中,如下所示。
如图所示:
Results:
Name Date Yes/No
a 2000-01-01 No
b 2001-01-01 Yes
c 2002-01-01 Yes
我有:
DECLARE @boolean as varchar(10)
IF EXISTS(
SELECT ID FROM Table 2
)
SET @boolean = 'Yes'
ELSE SET @boolean = 'No'
SELECT Name, Date, @boolean as 'Yes/No'
FROM Table 1
LEFT JOIN Table 2 u ON Table 1.ID = Table 2.ID
但是,这会返回如下所示的结果:
Name Date Yes/No
a 2000-01-01 Yes
b 2001-01-01 Yes
c 2002-01-01 Yes
有关如何操作此查询以返回预期的任何想法?
答案 0 :(得分:1)
一个选项是LEFT JOIN
第一个表到第二个表,然后检查第一个表中的每个记录,看看它的ID
是否与第二个表中的任何内容匹配。
SELECT t1.Name,
t1.Date,
CASE WHEN t2.ID IS NOT NULL THEN 'Yes' ELSE 'No' END AS [Yes/No]
FROM table1 t1
LEFT JOIN table2 t2
ON t1.ID = t2.ID
在这里演示:
答案 1 :(得分:1)
如果第二个表上没有匹配的结果(t2.ID IS NULL),使用LEFT JOIN并使用CASE进行检查,您可以轻松地获得所需内容,如下所示:
SELECT Name, Date, CASE WHEN t2.ID IS NULL THEN 'No' ELSE 'Yes' END AS [Yes/No]
FROM Table1 t1 LEFT JOIN Table2 t2 ON t1.ID = t2.ID
答案 2 :(得分:0)
Select * , case when exists(select 1 from Table2 as b where b.ID = a.ID and b.Name = a.Name) then 'Yes' else 'No' end as 'Yes/No'
From table1 as a
您的查询:
DECLARE @boolean as varchar(10)
IF EXISTS(
SELECT ID FROM Table 2
)
SET @boolean = 'Yes'
将始终返回true,因为您只检查ID
是否存在(table2
中始终存在记录),您忘记检查ID
是否存在table1
你可能不这样做,因为指标是一个动态值。
答案 3 :(得分:0)
如果left join
可能会返回多个不需要的结果,则可以改为使用outer apply()
:
select t1.*, [Yes/No]=coalesce(x.Yes,'No')
from table_1 t1
outer apply (
select Yes='Yes'
from table_2 t2
where t1.id = t2.id
) x