我正在使用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处查询。)
答案 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)