SQL Server - 如果一个表中的值存在于另一个表中,则设置变量

时间:2017-03-23 12:49:46

标签: sql sql-server

我的表格设置如下:

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

有关如何操作此查询以返回预期的任何想法?

4 个答案:

答案 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

在这里演示:

Rextester

答案 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