MS Access查询多个条件

时间:2014-03-17 02:06:11

标签: ms-access access-vba hardcode

我正在尝试使用多个条件构建访问查询。要查询的表是“tblVendor”,其中包含有关供应商出货数据的信息,如下所示:

enter image description here

第二个表是“tblSchedule”,其中包含每个供应商截止日期的时间表。此表包含数据分析的截止日期。

enter image description here

对于每个供应商,我需要选择具有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#));

根据需要,查询会给我一个看起来像的结果:

enter image description here

我现在关心的是我有很多记录被添加到“tblCutoffDate”中,这使得我很难对查询中的日期进行硬编码。有没有更好的方法来编写上面的SQL语句而没有任何硬编码?

2 个答案:

答案 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;