1

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

在此处输入图像描述

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

在此处输入图像描述

对于每个供应商,我需要选择 ShipDate >= 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 语句而无需任何硬编码?

4

2 回答 2

1

您可以尝试类似的方法——这应该处理没有过去截止日期的供应商,或者没有未来截止日期的供应商

“今天”需要适当的转换为无时间的日期

比较“=”可以同时进行,或者一个,或者没有 Max/Min

“null”可以替换为 Max/Min 中的 1/1/1900 和 12/31/3999

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
于 2014-03-17T03:03:12.870 回答
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;
于 2014-03-17T02:25:40.830 回答