我正在尝试使用多个条件构建访问查询。要查询的表是“tblVendor”,其中包含有关供应商出货数据的信息,如下所示:
第二个表是“tblSchedule”,其中包含每个供应商截止日期的时间表。此表包含数据分析的截止日期。
对于每个供应商,我需要选择具有ShipDate> = CutoffDate的记录。虽然这里的数据没有显示,但多个供应商可能有相同的CutoffDate。 对于“tblCutoffdate”中的少量记录,我可以编写一个看起来像这样的查询:
SELECT tblVendors.ShipmentId, tblVendors.VendorNumber, tblVendors.VendorName,
tblVendors.Units, tblVendors.ShipDate
FROM tblVendors INNER JOIN tblCutoffDate ON tblVendors.VendorNumber =
tblCutoffDate.VendorNumber
WHERE (((tblVendors.VendorNumber) In (SELECT VendorNumber FROM [tblCutoffDate] WHERE
[tblCutoffDate].[CutoffDate] = #2/1/2014#)) AND ((tblVendors.ShipDate)>=#2/1/2014#)) OR
(((tblVendors.VendorNumber) In (SELECT VendorNumber FROM [tblCutoffDate] WHERE
[tblCutoffDate].[CutoffDate] = #4/1/2014#)) AND ((tblVendors.ShipDate)>=#4/1/2014#));
根据需要,查询会给我一个看起来像的结果:
我现在关心的是我有很多记录被添加到“tblCutoffDate”中,这使得我很难对查询中的日期进行硬编码。有没有更好的方法来编写上面的SQL语句而没有任何硬编码?
答案 0 :(得分:1)
你可能会尝试类似的东西 - 这应该处理没有过去截止的供应商, 或那些没有未来截止的人
"今天"需要适当的转换到没有时间的日期
比较" ="可以同时进行两次,或者一次,或者没有Max / Min
"空"可以用1/1/1900和12/31/3999以Max / Min
代替SELECT tblvendors.shipmentid,
tblvendors.vendornumber,
tblvendors.vendorname,
tblvendors.units,
tblvendors.shipdate
FROM tblvendors
LEFT JOIN
( SELECT vendornum,
Max( iif cutoffdate < today, cutoffdate, null) as PriorCutoff,
Min( iif cutoffdate >= today, cutoffdate, null) as NextCutoff
FROM tblcutoffdate
GROUP BY vendornum
) as VDates
ON vendornumber = vendornum
WHERE tblvendors.shipdate BETWEEN PriorCutoff and NextCutoff
ORDER BY vendornumber, shipdate, shipmentid
答案 1 :(得分:0)
一个更简单的WHERE
子句可以为您提供所需的内容。
SELECT
v.ShipmentId,
v.VendorNumber,
v.VendorName,
v.Units,
v.ShipDate
FROM
tblVendors AS v
INNER JOIN tblCutoffDate AS cd
ON v.VendorNumber = cd.VendorNumber
WHERE v.ShipDate >= cd.CutoffDate;