使用 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,随时改进它。
我是运行以下查询:
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,随时改进它。