我有一个非常简单的存储过程,允许用户根据日期显示不同的数据。我有2个参数,一个开始日期和结束日期。所以基本上,查询根据日期范围返回数据。但是,根据这些日期,我需要查询不同的表。因此,如果用户想要2015年1月1日至2015年1月31日的数据,则需要一个表。如果他们想要2015年2月1日至2015年2月28日的数据,那么它就是一张不同的表。他们也被允许越过,所以2015年1月1日 - 2015年2月28日。
SELECT *
FROM shipments
JOIN costs ON shipment.shipmentid = cost.shipmentid
WHERE ship_date between @sdate and @edate
如果ship_date在2015年2月1日之前,那么我需要从另一个成本表中提取。
我希望这是有道理的。动态SQL会成为可行的方法吗?
答案 0 :(得分:0)
您只想使用您选择的后端编程语言动态创建查询。没有纯粹的SQL方法来实现它。
答案 1 :(得分:0)
最简单的方法是功能,例如:
if @sDate <'some_date'
@tableName = 'first_table';
else
@tableName = 'other_table';
end if;
ELECT *
FROM @tableName
JOIN costs ON shipment.shipmentid = cost.shipmentid
WHERE ship_date between @sdate and @edate
您也可以在桌面上进行联合,但这可能会产生成本问题(不确定表的大小)。
答案 2 :(得分:0)
我避免在SP中动态构建SQL,因为它会带走“预编译”的好处。正如dognose所提到的,Union
确实是最好的途径。
总有不止一种方法可以做到这一点,你可以尝试性能;但类似的东西应该有效:
SELECT * FROM shipments
INNER JOIN (
SELECT col1,col2,col3,shipment_id FROM costs
WHERE ship_date > "2/1/2015"
UNION
SELECT col1,col2,col3,shipment_id FROM costs_old
WHERE ship_date <= "2/1/2015"
) AS costs_union ON shipments.shipmentid = costs_union.shipmentid
WHERE shipments.ship_date between @sdate and @edate
根据这些成本表的大小,您可能希望联合查询中的WHERE子句使它们变小......