2010-01-13 1 views
0

У меня есть таблица, заполненная закупочные цены, как это:MS-Access Получить цену продукта на определенной дате заказа

 
sku     price btw startdate 
PCR-CA5425023181515 21,17 € 1 01/01/2009 
PCR-CA5425023181515 999,00 € 1 06/06/2009 
PCR-CA5425023181515 444,00 € 4 09/07/2009 
PCR-CA5425023181515 100,00 € 4 10/08/2009 

Я другой стол, заполненный с заказами, как это:

 
sku     quantity orderdate 
PCR-CA5425023181515  5  01/05/2009 
PCR-CA5425023181515 10  01/12/2009 
PCR-CA5425023181515 10  24/12/2009 

Моя цель - получить каждую покупную цену за заказ с этой даты. (Например: когда я заказал продукт в первой из майских (01/05), он стоил 21,17 евро. Когда я заказал его в первый раз (01/12), он стоил 100,00 евро.)

Я боролся с этим в течение последнего часа, но пока не нашел ничего полезного.

ответ

1
SELECT 
    O.sku, 
    O.qty, 
    PP.price 
FROM 
    Orders O 
INNER JOIN Purchase_Prices PP ON 
    PP.sku = O.sku AND 
    PP.start_date <= O.order_date 
WHERE 
    NOT EXISTS 
    (
      SELECT 
       * 
      FROM 
       Purchase_Prices PP2 
      WHERE 
       PP2.sku = PP.sku AND 
       PP2.start_date <= O.order_date AND 
       PP2.start_date > PP.start_date 
    ) 

В качестве альтернативы:

SELECT 
    O.sku, 
    O.qty, 
    PP.price 
FROM 
    Orders O 
INNER JOIN Purchase_Prices PP ON 
    PP.sku = O.sku AND 
    PP.start_date <= O.order_date 
LEFT OUTER JOIN Purchase_Prices PP2 ON 
    PP2.sku = O.sku AND 
    PP2.start_date <= O.order_date AND 
    PP2.start_date > PP.start_date 
WHERE 
    PP2.sku IS NULL 
+0

Это точно! Первый, с подзапросом, работает как шарм. Я также пробовал что-то с WHERE EXISTS, но имел несколько подзапросов. Это не закончилось. Второй, однако, не работает. Доступ жаловался на пропавших операторов. (Это, очевидно, не так) – skerit

+0

Остерегайтесь, потому что подзапросы с NOT не оптимизированы в Jet/ACE и не всегда используют индексы по обе стороны от критерия. NOT EXISTS в этом отношении еще хуже, чем NOT IN, которая использует оба индекса большую часть времени. Случаи, когда он не работает, не являются полностью предсказуемыми, и поскольку он может иметь какое-то отношение к метаданным, подзапрос NOT, который не является производителем свинца сегодня, может быть одним из них при некоторых других обстоятельствах, например, когда задействованы другие записи. –