SQL联盟?或其他方法

时间:2012-10-05 20:13:04

标签: sql talend

我正在使用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. 

现在我要做的是用我的其他DB('MAIN')查询这个视图。

标准是如果IDCUST是相同的那么我只想要来自'USA'数据库的行。

我试过:

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

答案 0 :(得分:2)

我认为联盟都是最好的方法,但你需要稍微调整一下:

select *
from usa.dbo.ViewUSA
union all
select *
from MAIN.dbo.VIEWMAIN vm
where vm.idcust not in (select idcust from usa.dbo.ViewUSA)

答案 1 :(得分:1)

通过使用union,您将从集合中删除重复的行。 union还希望每个select中的列都是相同的数据类型。如果表中已命名相同的列具有相同的数据类型,则应生成所需的输出。

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

UNION

SELECT IDCUST
    ,NAMECUST
    ,CODETERM
    ,AMTCRLIMT
    ,DATELASTIV
    ,AMTBALDUEH
FROM MAIN.dbo.VIEWMAIN

答案 2 :(得分: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

答案 3 :(得分:0)

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

编辑:试试这个

SELECT * 
FROM USA.dbo.VIEWUSA a 
WHERE a.IDCUST NOT IN (SELECT DISTINCT IDCUST FROM MAIN.dbo.VIEWMAIN)