1

我正在使用 SQL Server 2008 和 Talend

我面临的问题是,我在两个不同的数据库中有两个表,它们具有相同的字段,我正在尝试查询它们并满足某些条件。

用户具有查看表和所有表的正确权限。

这两个表我只需要几个字段,所以我创建了视图以使生活更轻松:Db USA 我创建了一个视图

(在视图中)

"SELECT IDCUST, NAMECUST,CODETERM,AMTCRLIMT,DATELASTIV,AMTBALDUEH
FROM TABLE!
WHERE COUNTRYCODE = 'USA' OR COUNTRYCODE ="U.S.A" //this is for USA server 
only the other doesn't have the WHERE clause. 

现在我想做的是用我的另一个数据库('MAIN')查询这个视图。

标准是如果 IDCUST 相同,那么我只想要“美国”数据库中的行。

我试过了:

SELECT *  
FROM USA.dbo.VIEWUSA 
UNION 
SELECT *  
FROM MAIN.dbo.VIEWMAIN
WHERE MAIN.dbo.IDCUST <> USA.dbo.VIEWUSA.IDCUST

尽管说 USA.dbo.VIEWUSA.IDCUST 不合适,但它有一个错误。

我尝试将其作为 JOIN,但我的连接根本不起作用(最大行数约为 6k,在我停止之前它以 100k 的速度查询。)

4

4 回答 4

2

我认为 union all 是最好的方法,但是您需要稍作调整:

select *
from usa.dbo.ViewUSA
union all
select *
from MAIN.dbo.VIEWMAIN vm
where vm.idcust not in (select idcust from usa.dbo.ViewUSA)
于 2012-10-05T20:23:31.370 回答
1

通过使用联合,您将从集中删除重复的行。联合还希望每个选择中的列具有相同的数据类型。如果表中名称相同的列具有相同的数据类型,这应该会产生您想要的输出。

SELECT IDCUST
    ,NAMECUST
    ,CODETERM
    ,AMTCRLIMT
    ,DATELASTIV
    ,AMTBALDUEH
FROM USA.dbo.VIEWUSA

UNION

SELECT IDCUST
    ,NAMECUST
    ,CODETERM
    ,AMTCRLIMT
    ,DATELASTIV
    ,AMTBALDUEH
FROM MAIN.dbo.VIEWMAIN
于 2012-10-05T20:19:02.247 回答
1

假设列名的数据类型相同,并且您正在寻找类似联合的语法而不是连接语法......

VIEWMAIN 中没有 VIEWUSA 条目的所有记录。

SELECT customer_id, customer_name
FROM MAIN.dbo.VIEWMAIN
minus
SELECT customer_id, customer_name  
FROM USA.dbo.VIEWUSA 

VIEWUSA 中所有不在 VIEWMAIN 中的记录

SELECT customer_id, customer_name
FROM MAIN.dbo.VIEWUSA
minus
SELECT customer_id, customer_name  
FROM USA.dbo.VIEWMAIN

仅在两个表中的记录

SELECT customer_id, customer_name
FROM MAIN.dbo.VIEWUSA
intersect
SELECT customer_id, customer_name  
FROM USA.dbo.VIEWMAIN
于 2012-10-05T20:24:28.937 回答
0

如果我理解正确,这就是你想要的。这将从 IDCUST 相同的两个表中获取所有数据。

编辑:试试这个

SELECT * 
FROM USA.dbo.VIEWUSA a 
WHERE a.IDCUST NOT IN (SELECT DISTINCT IDCUST FROM MAIN.dbo.VIEWMAIN)
于 2012-10-05T20:15:51.867 回答