检查一个表中的多列与另一表中的一列

时间:2020-02-25 11:25:01

标签: sql sql-server tsql

我在SQL Server上有两个表。

第一:

[id] ... [name1] ... [name2] [name3] ... [name4] ... [name5] [name6]

第二:

[id] ... [name] ...

我想从第一个表中选择所有行,其中所有名称都存在于第二个表中。我知道有一种方法可以通过6个连接来做到这一点,但是有没有“更漂亮”的方法?

SELECT A.*
FROM FirstTable A
    LEFT JOIN SecondTable B ON A.[Name1] = B.[Name]
    LEFT JOIN SecondTable C ON A.[Name2] = C.[Name]
    ...
WHERE
    B.[Name] IS NOT NULL
    AND C.[Name] IS NOT NULL
    ...

奖金问题,是否有办法代替只选择包含有效名称的行,选择所有行,然后在选择中添加另一列,以指出哪些名称无效?

1 个答案:

答案 0 :(得分:1)

您可以使用apply

select t1.*
from table1 t1 cross apply
     (select count(*) as cnt
      from (values (name1), (name2), (name3), (name4), (name5), (name6)
           ) v(name) join
           table2 t2
           on t2.name = v.name
     ) v
where v.cnt = 6;

通过用LEFT JOIN替换INNER JOIN并删除WHERE子句,可以稍微简化您的方法。 INNER JOIN个需要匹配。