2017-08-30 123 views
-1

我正在使用以下代碼來嘗試UNION兩組數據,雖然它運行時沒有錯誤,但它運行超過10分鐘並且沒有返回結果,所以我想知道是否有某種東西我做錯了嗎?在查詢和子查詢中使用SQL中的UNION

select BIH.SourceCode, BIH.MarketValueAmt as CorrectedAmt 
from [dbo].[IRA_HIST] as BIH 
JOIN 
    (select accountno, accountclass 
    from accounttable 
    where accountclass in ('A','B','C','D')) AS AccountNos 
ON BIH.ACCOUNTNO = ACCOUNTNOS.ACCOUNTNO 
where BIH.securityno > '0' 
UNION 
SELECT SourceCode, (Amount*(-1)) as CorrectedAmt 
from accttable a, activitytable b 
where a.accountclass in ('A','B','C','D') 
and b.recordtype in ('r','c') 

任何指導都非常有幫助。

+3

查看執行計劃。 –

+0

不幸的是,我沒有在我的公司查看他們的權限/訪問權限。 – SMBRADBE

+3

然後得到它。如果您沒有權限執行查詢,則無需調試查詢。 –

回答

0

在你的第二個選擇,因爲你查詢兩次相同的表,你應該能夠加入一個公共密鑰(例如FROM TABLE a JOIN TABLE b ON a.cKey = b.cKey)。

或者,您可以簡化第二SELECT

FROM TABLE WHERE AccountClass IN ('A', 'B',...) OR RecordType IN ('r', 'c')

1

由於在從accounttable數據不需要其他的計算和轉換,您可以直接與ira_hist加入它,沒有必要有子查詢。此外,您需要將其設置爲ON。[key column] = b。[key column] - 可能在您的第二個查詢中加入您的帳號no

SELECT BIH.SourceCode, 
     BIH.MarketValueAmt AS CorrectedAmt 
    FROM [dbo].[IRA_HIST] BIH 
    JOIN accounttable AccountNos 
    ON BIH.ACCOUNTNO = ACCOUNTNOS.ACCOUNTNO 
    AND BIH.securityno > '0' 
    AND AccountNos.accountclass in ('A','B','C','D') 
UNION -- or UNION ALL if you want to retain duplicates 
SELECT SourceCode, 
     (Amount*(-1)) as CorrectedAmt 
    FROM accttable a, 
    JOIN activitytable b 
    ON a.[key column] = b.[key column] -- probably accountno 
    AND a.accountclass IN ('A','B','C','D') 
    AND b.recordtype IN ('r','c')