检查另一个数据库中是否存在帐户#

时间:2014-05-30 09:42:28

标签: sql sql-server sql-server-2008

考虑以下

-- 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上

3 个答案:

答案 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