我在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
...
奖金问题,是否有办法代替只选择包含有效名称的行,选择所有行,然后在选择中添加另一列,以指出哪些名称无效?
答案 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
个需要匹配。