根据多个条件联接两个表

时间:2019-03-29 16:45:25

标签: sql sql-server tsql

我有两个表,一个表仅包含id列,第二个表具有id和源列。
我正在尝试根据ID在表1和表2之间创建匹配,并且如果source等于1。我想返回id为“ match”的状态,如果source为0,我希望该id状态为“ not”匹配”。

DECLARE @T1 AS TABLE (
    id int 

)
DECLARE @T2 AS TABLE (
    id int, 
    source int
)
INSERT INTO @T1 VALUES
(1),
(2),
(3),
(4),
(5)

INSERT INTO @T2 VALUES
(1, '0'),
(2, '1'),
(3, '0'),
(4, '1'),
(5, '1')

我非常确定这是一个左连接,并基于两个表中的id进行连接。但是我不确定如何创建新列并根据源条件来操纵“匹配”,“不匹配”

select id, status
from t1
left join t2 
on t1.id = t2.id
where 
case source = 1 'Match'
case source = 0 'Not Matched'

我的预期结果

id status
1  no match
2  match
3  no match
4  match
5  match

3 个答案:

答案 0 :(得分:2)

请尝试以下操作,在“选择”行中使用case-when表达式。

select t.id, [status] = case when t2.source = 1 then 'Match' else 'Not Match' end
from @T1 t
left join @T2 t2 on t.id = t2.id

答案 1 :(得分:1)

您可以在select语句中使用大小写条件。

https://docs.microsoft.com/en-us/sql/t-sql/language-elements/case-transact-sql?view=sql-server-2017

select t1.id, 
    case t2.source when 0 then 'Not Matched'
        when 1 then 'Match'
        else ''
    end as [status]
from @T1 t1
    inner join @T2 t2 on t1.id = t2.id

答案 2 :(得分:1)

您的 CASE 表达式应该在 SELECT 语句中,而不是 WHERE 子句中,您可以在其中检查source列的值,并根据该值返回Match/No Match,如下所示:

SELECT T2.id,
       CASE T2.source WHEN '1' THEN 'Match' ELSE 'No Match' END Status
FROM @T1 T1 JOIN @T2 T2
ON T1.id = T2.id;

返回:

+----+----------+
| id |  Status  |
+----+----------+
|  1 | No Match |
|  2 | Match    |
|  3 | No Match |
|  4 | Match    |
|  5 | Match    |
+----+----------+

您可以在the live demo here上对其进行检查。


如果Source列包含两个可能的值,即'0''1',则它可能包含其他值,则:

SELECT T2.id,
       CASE T2.source WHEN '1' THEN 'Match'
                      WHEN '0' THEN 'No Match' 
                      WHEN 'Other Value' THEN 'Other Result' -- and so on
       END Status
FROM @T1 T1 JOIN @T2 T2
ON T1.id = T2.id;

最后,将数字存储为字符串是个坏主意,如果只需要存储{,请考虑使用 INT BIT 数据类型{1}}