6

我正在运行以下查询:

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 子句是不可能的,因为它返回错误:

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

任何人都可以建议以这种方式进行替代吗?

我正在使用 SSMS 2014

4

4 回答 4

2

您可以尝试以下方法:

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

或左加入:

select from othertable left join mytable using id

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

fly-by-post,随时改进。

于 2016-07-04T15:05:43.950 回答
2

只需创建一个包含所有这些凭证的表格(希望您已经有一个),然后使用IN()从表格中选择:

SELECT 
    ReceiptVoucherId, 
    VoucherId, 
    ReceiptId,
    rvtransactionAmount, 
    AmountUsed, 
    TransactionTypeId
FROM 
    [Scratch].[dbo].[LoyaltyVoucherTransactionDetails]
WHERE       
    VoucherId IN (SELECT VoucherId FROM VourchersTable)
于 2016-07-04T14:48:55.690 回答
1

insert the vouchers to lookup in a seperate table . lets call it Voucher.

Then this query should do the trick. It does not use the IN Clause. but instead it uses Inner join which will be faster.

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 
于 2016-07-04T14:57:17.777 回答
0

也许以下内容对您有用:

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

WHERE VoucherID in (SELECT VoucherID FROM @t)

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

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

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

于 2016-07-04T14:50:21.370 回答