如何检查两个表,仅从sql server中匹配的表中返回值

时间:2019-02-07 12:42:11

标签: sql sql-server

我有两个表,如下所示

表1

Name | Code
John | X11
Jane | CFT
Scot | KIT

表2

Name | Code
Kate | FX5
Jake | 1JI
Pete | GTS

我要在一个查询中实现的是如何检查是否在其中传递代码,因此必须同时检查表并仅返回匹配的代码。 例如

    Select Name
    from Table 2 
    where Code='X11

表2中没有上面的代码,所以我没有结果,但是下面有代码

Select Name
from Table 1 
where Code='X11'

这会给我我想要的john的输出。

我如何合并两个查询,只是要检查哪个表中存在哪个代码,然后它只能从该表中返回名称值

4 个答案:

答案 0 :(得分:3)

您也可以尝试以下操作。

SELECT * 
FROM   (SELECT * 
        FROM   table1 
        UNION ALL 
        SELECT * 
        FROM   table2) t1 
WHERE  code = 'X11' 

答案 1 :(得分:2)

使用union all

Select Name
from Table2 
where Code = 'X11'
union all
Select Name
from Table1 
where Code = 'X11';

答案 2 :(得分:2)

如果只需要2个表中的1个结果,则可以使用COALESCE()

SELECT COALESCE(
  (SELECT Name FROM Table1 WHERE Code='X11'),
  (SELECT Name FROM Table2 WHERE Code='X11')
  ) Name

这样,如果在第一张表中找到'X11',将不会扫描第二张表。

答案 3 :(得分:1)

样本数据

DECLARE @Table1 AS TABLE
    (Name   VARCHAR(100),
     Code VARCHAR(100)
    )
INSERT INTO  @Table1
SELECT 'John' , 'X11' UNION ALL
SELECT 'Jane' , 'CFT' UNION ALL
SELECT 'Scot' , 'KIT' UNION ALL
SELECT 'Jane' , 'TFT' 

DECLARE @Table2 AS TABLE
    (Name   VARCHAR(100),
     Code VARCHAR(100)
     )
 INSERT INTO  @Table2
 SELECT 'Kate' , 'FX5' UNION ALL
 SELECT 'Jake' , 'X11' UNION ALL
 SELECT 'Jane' , 'SER' UNION ALL
 SELECT 'Pete' , 'KIT'

使用交叉应用获得预期结果的sql代码,该代码用于查找将在两个表中都匹配的多个代码

SELECT t1_Name,
       t2_Name,
       Code
FROM
(
SELECT 
    CASE WHEN t.Code = a.Code THEN t.Name ELSE NULL END AS t1_Name,
    CASE WHEN t.Code = a.Code THEN a.Name ELSE NULL END AS t2_Name,
    t.Code AS Code,
    CASE WHEN t.Code = a.Code THEN 1 ELSE 0 END AS Flag
FROM @Table1 t
CROSS APPLY 
(
SELECT Name,Code FROM @Table2 t2
) AS a
)dt WHERE Flag = 1

结果

t1_Name  t2_Name    Code
*************************
John     Jake        X11
Scot     Pete        KIT