我有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.