2016-07-04 95 views
2

我运行下面的查询:替代使用IN子句

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的,我有名单。

我在这里的问题是,我VoucherID的名单是187K长,所以IN子句是不可能的,因为它会返回错误:

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

灿任何人都建议在这样做的替代方案?

我使用SSMS 2014

+1

尝试使用临时表代替存储值 –

+1

如果这些凭证ID存在于其他位置,则也可以使用子查询,而不是实际值。但是,像@GiorgosBetsos那样存储在表格中的建议将是一种更简洁的方法。 – Mfusiki

+2

这些187K值从哪里来*?他们当然不是手动输入的固定列表?结果数据*去*在哪里?有人直接消费这些结果太多了。感觉就像你可能已经将多个程序步骤中的单个逻辑查询分解了一样,这是中间步骤之一。如果我们能够理解整个端到端的需求,我们可能会提供更好的整体解决方案。 –

回答

1

只需创建一个包含所有这些优惠券表(希望你已经有一个),然后使用IN()选择从表:

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

根据权限的不同,创建“真实”表格并不那么容易......我想tab变量或cte可能会更容易一点,不是吗? – Tyron78

+0

如果他没有特权,他可以问问他的DBA。 'CTE'并不是一个坏主意,但是它对于190k记录 – sagi

+0

哈哈UR正确...但是在一家我几年前曾经工作过的公司中,DBA会高兴地将你的手指翻过来告诉你f * **关闭。 ;-)如果它来到特权,他们会变得非常讨厌。 :-)但是你是对的 - 如果你必须分析一些东西,你应该有特权。关于记录数量:我最近使用了一个类似300K的CTE,它工作得很好......但是我使用了一个脚本来为我后台查询。 ;-) – Tyron78

0

也许你以下工作:

首先,声明一个类型为表的变量(或者是一个临时表),然后在其中插入你的ID。 修改查询到

WHERE VoucherID in (SELECT VoucherID FROM @t) 

或者(但类似写密集型你的手;-))是一个CTE的创作:

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

又一次的你“里的重新设计.. IN ...“部分。

+0

创建一个具有187k记录的CTE?祝你好运 。 – sagi

0

插入优惠券在单独的表中查找。我们称之为优惠券。

然后这个查询应该做的伎俩。它确实使用IN子句而不是。而是使用Inner join,这会更快。

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 
0

你可以试试这种方法:

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

或左连接:

select from othertable left join mytable using id 

不知道有更好的表现,也是第二个查询可以给你的空行,如果它是不宣布为外键。

通过邮件,随时改善它。