3

こんにちは、ありがとうございました。SQLServer2008を使用しています。課題は次のとおりです。

私は3つのデータベースを持っていQ_DBますCAN_DB、、USA_DBCAN_DB同じテーブルをUSA_DB持っていますが、2つの異なる国を表しています

Q_DBにはキューのテーブルがあります。1つのテーブルが呼び出されACCOUNTS、対象の列はACCOUNTIDSERVER

のフィールドから他の2つのデータベースの情報を照会したいと思いますACCOUNTS。例は次のとおりです。

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')

どんな助けや意見や提案も大歓迎です。ありがとう

4

1 に答える 1

3

IN単一の値( )で使用している理由がわかりませんCAN_DB

EXISTSまた、の代わりに事前に認識しておく必要がありINます。

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代わりにキーワードを使用します。

AMTDUE編集:同じに従って両方のサーバーから合計ACTNAMEしたい場合SHIPCOUNTRY

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
于 2012-10-22T18:03:48.697 に答える