我有3张桌子:

table_product (30 000 row)
---------
ID
label


_

table_period (225 000 row)
---------
ID
date_start
date_end
default_price
FK_ID_product




table_special_offer (10 000 row)
-----
ID
label
date_start,
date_end,
special_offer_price
FK_ID_period


所以我需要从所有这些表中加载数据,所以这就是我要做的:
1 /像这样从“ table_product”加载数据

select *
from table_product
where label like 'gun%'


2 /像这样从“ table_period”加载数据

select *
from table_period
where FK_ID_product IN(list of all the ids selected in the 1)


3 /像这样从“ table_special_offer”加载数据

select *
from table_special_offer
where FK_ID_period IN(list of all the ids selected in the 2)


您可能会认为第3点中的IN子句可能非常大(例如75,000个大),所以我很有可能出现超时或“已达到表达式服务限制”之类的情况。

您是否曾经遇到过这样的事情,并且如何避免出现这种情况?

PS:
上下文:SQL Server 2005,.net 2.0
(请不要告诉我我的设计不好,或者我不应该“选择*”,我只是简化了我的问题,所以它比描述我的业务的500页要简单一些)。

谢谢。

最佳答案

切换到使用联接:

SELECT <FieldList>
FROM Table_Product prod
    JOIN Table_Period per ON prod.Id = per.FK_ID_Product
    JOIN Table_Special_Offer spec ON per.ID = spec.FK_ID_Period
WHERE prod.label LIKE 'gun%'


您应该注意的是IN与JOIN与EXISTS的区别-great article here.

07-26 01:07