使用 IN 子句的替代方法

alternatives to using IN clause

我是运行以下查询:

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

目的是为我拥有的凭证 ID 列表提取 ReceiptVoucherId / VoucherId / ReceiptId / rvtransactionAmount / AmountUsed / TransactionTypeId 数据。

我的问题是我的 VoucherID 列表有 187k 长,所以 IN 子句是不可能的,因为它 returns 错误:

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

任何人都可以建议这种方法的替代方法吗?

我正在使用 SSMS 2014

只需创建一个包含所有这些代金券的 table(希望您已经拥有),然后使用 IN() 从 table 中选择:

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

也许以下内容适合您:

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

WHERE VoucherID in (SELECT VoucherID FROM @t)

或者(但对您的手来说类似的写入密集型 ;-) )是创建 CTE:

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

再次重新设计您的 "WHERE... IN..." 部分。

插入优惠券以在单独的 table 中查找。让我们称之为代金券。

那么这个查询应该可以解决问题。它 使用 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 

你可以试试这个方法:

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

或左连接:

select from othertable left join mytable using id

不确定哪个性能更好,如果第二个查询未声明为外键,也可能会返回空行。

路过-post,随时改进它。