我正在运行以下查询:
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
答案 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
不确定什么有更好的性能,如果没有声明为外键,第二个查询可能会给你空行。
飞越,随时改进。