使用IN子句的替代方法

时间:2016-07-04 14:46:06

标签: sql ssms-2014

我正在运行以下查询:

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列表长度为187k,因此无法使用IN子句,因为它返回错误:

内部错误:已达到表达式服务限制

有人可以通过这种方式建议替代方案吗?

我正在使用SSMS 2014

4 个答案:

答案 0 :(得分:1)

只需创建一个包含所有此优惠券的表格(希望您已有一张优惠券),然后从表格中选择IN()

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

答案 1 :(得分:0)

以下可能适合您:

首先,声明一个table类型的变量(或临时表)并将ID插入其中。 将您的查询修改为

WHERE VoucherID in (SELECT VoucherID FROM @t)

或者(但你的手的类似写密集;-))是CTE的创建:

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

再次重新设计你的“WHERE ... IN ...”部分。

答案 2 :(得分:0)

插入凭证以在单独的表格中查找。我们称之为凭证。

然后这个查询就可以了。 使用IN子句。但相反,它使用内连接会更快。

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 

答案 3 :(得分:0)

您可以尝试这种方法:

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

或左连接:

select from othertable left join mytable using id

不确定什么有更好的性能,如果没有声明为外键,第二个查询可能会给你空行。

飞越,随时改进。