2012-10-22 2 views
3

안녕하세요. 시간 내 주셔서 대단히 감사합니다. 저는 SQL Server 2008을 사용하고 있습니다. 제 질문은 다음과 같습니다 :JOIN 문을 사용하여 다른 데이터베이스에있는 테이블을 쿼리하는 모범 사례

데이터베이스가 3 개 있습니다. Q_DB, CAN_DB, USA_DB입니다. CAN_DBUSA_DB은 동일한 표가 있지만 두 개의 다른 국가를 나타냅니다.

Q_DB에는 대기열 테이블이 있습니다. 하나 개의 테이블은 ACCOUNTS라고 관심있는 열은 ACCOUNTID 내가 ACCOUNTS의 분야에서 다른 두 데이터베이스의 정보를 조회 할

SERVER입니다됩니다. 예는 다음과 같습니다

Q_DB.dbo.ACCOUNTS

  • ID123 CAN_DB
  • ID456 USA_DB
  • ID789 CAN_DB 내가, 내가이 방법을 수행 할 수 있습니다 알고

하지만 그 결과를 얻기위한 다른 방법이 있는지 궁금합니다.

SELECT ACTNAME, AMTDUE, SHIPCOUNTY 
FROM CAN_DB.dbo.Accts 
WHERE ACCTID IN(SELECT ACCOUNTID FROM Q_DB.dbo.ACCOUNTS WHERE SERVER IN('CAN_DB') 
UNION ALL 
SELECT ACTNAME, AMTDUE, SHIPCOUNTRY 
FROM USA_DB.dbo.Accts 
WHERE ACCTID IN(SELECT ACCOUNTID FROM Q_DB.dbo.ACCOUNTS WHERE SERVER IN('USA_DB') 

어떤 도움이나 의견이나 제안이 있으면 감사하겠습니다. 감사합니다.

+0

당신은 당신이 UNION에 두 개의 서로 다른 쿼리의 결과를 원하는 말, 당신은 궁금되어있다 UNION을 사용하는 것보다 더 좋은 방법입니까? 네가 기대하고있는 것이 확실하지 않다. – cadrell0

+2

SQL Server ** 2010 ** ** - 2000, 2005, 2008, 2008 R2 및 2012 버전이 있지만 2010 버전은 없습니다. –

+0

UNION과 함께 사용하는 것이 가장 현명한 방법인지 또는 다른 방법을 사용하는 경우 UNION을 제거 할 수 있는지 확인하려고합니다. (기본적으로 코드를 다시 작성하기 때문에) 그리고 시간 주셔서 감사합니다. – jnoel10

답변

3

IN을 단일 값 (CAN_DB)으로 사용하는 이유가 표시되지 않습니다.

또한 IN 대신 EXISTS을 사용해야합니다.

SELECT ACTNAME, AMTDUE, SHIPCOUNTRY 
FROM CAN_DB.dbo.Accts a1 
WHERE EXISTS (SELECT * FROM Q_DB.dbo.ACCOUNTS WHERE ACCTID = a1.ACCTID AND SERVER = 'CAN_DB') 
UNION ALL 
SELECT ACTNAME, AMTDUE, SHIPCOUNTRY 
FROM USA_DB.dbo.Accts a2 
WHERE EXISTS (SELECT * FROM Q_DB.dbo.ACCOUNTS WHERE ACCTID = a2.ACCTID AND SERVER = 'USA_DB') 

참고 : UNION ALL을 사용하면 중복되는 경우 (있는 경우) 중복됩니다. 고유 한 행을 선택하도록 쿼리하려면 UNION 키워드를 사용하십시오. 이 같은 ACTNAMESHIPCOUNTRY에 따라 두 서버에서 AMTDUE 합계하려면 :

편집

그래서
SELECT COALESCE(can.ACTNAME,usa.ACTNAME) as ACTNAME, 
     COALESCE(can.AMTDUE,0)+COALESCE(usa.AMTDUE,0) as AMTDUE, 
     COALESCE(can.SHIPCOUNTRY,usa.SHIPCOUNTRY) as SHIPCOUNTRY 
FROM CAN_DB.dbo.Accts can 
FULL OUTER JOIN USA_DB.dbo.Accts usa 
ON  can.ACTNAME = usa.ACTNAME AND 
     can.SHIPCOUNTRY = usa.SHIPCOUNTRY 
+0

답변 해 주셔서 감사 드리며, EXISTS가 IN보다 훨씬 좋아 보이는 데 동의합니다. 저는 UNION을 전혀 사용하지 않고 이것을 호출 할 수있는 방법이 있는지 확인하려고했습니다. UNION ALL을 사용하는 이유는 중복 된 ACCTID를 가질 수 있지만 다른 서버에서 발생할 가능성이 있기 때문입니다. – jnoel10

+0

중복 된 ACCTID가 서로 관련되어 있습니까? 그렇다면'JOIN'을 사용하여 할 수 있습니다 ... 같은'ACCTID'와'SHIPCOUNTRY'에 따라 두 서버의'AMTDUE'를 합치고 싶습니다. –

+0

슬프게도 그들은 슬프게도 연관성이 없을 수도 있습니다 (데이터 무결성 문제이기도하지만 느리게 진행됩니다). 그래서 JOIN을 사용하지 않았지만 SQL 초심자이며 아직 배우고 있습니다 :) – jnoel10

관련 문제