考虑以下
-- Get all objects from database A
use database_a;
select o.objectnumber
into #temp
from EDDSDBO.objects o
group by d.objectnumber;
-- #temp holds 0001, 0002
-- Get all objects from database B
use database_b;
select o.objectnumber,
case when o.objectnumer in #temp then 1 else 0 end as Match
from EDDSDBO.objects o
group by o.objectnumber;
-- Expected output
objectnumber Match
0001 1
0002 1
0003 0
但我收到错误:incorrect syntax near objectnumber
。
我似乎无法正确查询此查询。这里的语法是什么?
非常感谢任何帮助: - )
P.S。我在SQL Server 2008上
答案 0 :(得分:2)
如果objectnumber在每个表中都是唯一的,那么您可以将LEFT JOIN
与3部分对象名称一起使用:
SELECT b.objectnumber,
Match = CASE WHEN a.objectnumber IS NOT NULL THEN 1 ELSE 0 END
FROM database_b.EDDSDBO.objects b
LEFT JOIN database_a.EDDSDBO.objects a
ON a.objectnumber = b.objectnumber
如果它不是唯一的,你仍然可以这样做,但你需要使用group by和aggregate:
SELECT b.objectnumber,
Match = MAX(CASE WHEN a.objectnumber IS NOT NULL THEN 1 ELSE 0 END)
FROM database_b.EDDSDBO.objects b
LEFT JOIN database_a.EDDSDBO.objects a
ON a.objectnumber = b.objectnumber
GROUP BY b.objectnumber;
重要的是没有必要使用临时表,这在tempdb上是不必要的开销,而且你也失去了objectnumber
上任何索引的使用。
答案 1 :(得分:1)
将查询的第二部分更改为
use database_b;
select o.objectnumber,
case when o.objectnumer in (select distinct objectnumber from #temp) then 1
else 0 end as Match
from EDDSDBO.objects o
group by o.objectnumber;
答案 2 :(得分:1)
此示例不需要使用GROUP BY子句。
match列用于显示tableB中是否存在某行对象中的objectnumber值。如果您只想在tableB中指示存在行,而不显示行数,则不需要使用GROUP BY子句。
第一步应该是创建一个新集合,该集合仅包含要与tableB进行比较的tableA中的行集。然后,您可以使用NOT EXISTS运算符创建一个子查询,以指示tableB.objectnumber是否存在于tableB中。
With SubsetA(objectnumber) as (
select distinct objectnumber
from tableA)
select sa.objectnumber,
(case when exists (select null from tableB tb where sa.objectnumber = tb.objectnumber) then 1 else 0 end) as Match
from SubsetA sa