2016-07-04 91 views
2

我運行下面的查詢:替代使用IN子句

SELECT 
    ReceiptVoucherId, 
    VoucherId, 
    ReceiptId, 
    rvtransactionAmount, 
    AmountUsed, 
    TransactionTypeId 
FROM 
    [Scratch].[dbo].[LoyaltyVoucherTransactionDetails] 
WHERE  
    VoucherId IN 
    (2000723, 
    2000738, 
    2000774, 
    2000873, 
    2000888, 
    2000924, 
    2001023, 
    2001038, 
    2001074, 
    2001173) 

其目的是提取ReceiptVoucherId/VoucherId/ReceiptId/rvtransactionAmount/AmountUsed/TransactionTypeId數據voucherId的,我有名單。

我在這裏的問題是,我VoucherID的名單是187K長,所以IN子句是不可能的,因爲它會返回錯誤:

內部錯誤:表達式服務限制已經達到

燦任何人都建議在這樣做的替代方案?

我使用SSMS 2014

+1

嘗試使用臨時表代替存儲值 –

+1

如果這些憑證ID存在於其他位置,則也可以使用子查詢,而不是實際值。但是,像@GiorgosBetsos那樣存儲在表格中的建議將是一種更簡潔的方法。 – Mfusiki

+2

這些187K值從哪裏來*?他們當然不是手動輸入的固定列表?結果數據*去*在哪裏?有人直接消費這些結果太多了。感覺就像你可能已經將多個程序步驟中的單個邏輯查詢分解了一樣,這是中間步驟之一。如果我們能夠理解整個端到端的需求,我們可能會提供更好的整體解決方案。 –

回答

1

只需創建一個包含所有這些優惠券表(希望你已經有一個),然後使用IN()選擇從表:

SELECT 
    ReceiptVoucherId, 
    VoucherId, 
    ReceiptId, 
    rvtransactionAmount, 
    AmountUsed, 
    TransactionTypeId 
FROM 
    [Scratch].[dbo].[LoyaltyVoucherTransactionDetails] 
WHERE  
    VoucherId IN (SELECT VoucherId FROM VourchersTable) 
+0

根據權限的不同,創建「真實」表格並不那麼容易......我想tab變量或cte可能會更容易一點,不是嗎? – Tyron78

+0

如果他沒有特權,他可以問問他的DBA。 'CTE'並不是一個壞主意,但是它對於190k記錄 – sagi

+0

哈哈UR正確...但是在一家我幾年前曾經工作過的公司中,DBA會高興地將你的手指翻過來告訴你f * **關閉。 ;-)如果它來到特權,他們會變得非常討厭。 :-)但是你是對的 - 如果你必須分析一些東西,你應該有特權。關於記錄數量:我最近使用了一個類似300K的CTE,它工作得很好......但是我使用了一個腳本來爲我後臺查詢。 ;-) – Tyron78

0

也許你以下工作:

首先,聲明一個類型爲表的變量(或者是一個臨時表),然後在其中插入你的ID。 修改查詢到

WHERE VoucherID in (SELECT VoucherID FROM @t) 

或者(但類似寫密集型你的手;-))是一個CTE的創作:

WITH cte AS (SELECT 2000723 UNION ALL SELECT ...) 

又一次的你「裏的重新設計.. IN ...「部分。

+0

創建一個具有187k記錄的CTE?祝你好運 。 – sagi

0

插入優惠券在單獨的表中查找。我們稱之爲優惠券。

然後這個查詢應該做的伎倆。它確實使用IN子句而不是。而是使用Inner join,這會更快。

SELECT 
    L.ReceiptVoucherId, 
    L.VoucherId, 
    L.ReceiptId, 
    L.rvtransactionAmount, 
    L.AmountUsed, 
    L.TransactionTypeId 
FROM 
    [Scratch].[dbo].[LoyaltyVoucherTransactionDetails] L 
INNER JOIN dbo.Vouchers V ON L.VoucherId = V.VoucherId 
0

你可以試試這種方法:

select from mytable where id in (select id from othertable) 

或左連接:

select from othertable left join mytable using id 

不知道有更好的表現,也是第二個查詢可以給你的空行,如果它是不宣佈爲外鍵。

通過郵件,隨時改善它。