用作子查询时的额外记录:访问

时间:2018-06-01 00:42:46

标签: sql ms-access group-by sql-limit

我是一名具有基本SQL经验的新手开发人员,这个问题在过去几天一直在“尽我所能”。我已经在这里问了几次问题,并且认为......还没有...继续尝试。

我有一张桌子:

  • ID
  • Store
  • Product_Type
  • Delivery_Window
  • Despatch_Time
  • Despatch_Type
  • Pallets
  • Cartons
  • 许多其他列(start_weekday_num是其中两个)

我的目标是按product_type获取商店列表,其中包含所有其他列信息的最小despatch_time

我已经测试了基本查询。

SELECT Product_Type, Store, Min(Despatch_Time) as MinDes
FROM table
GROUP BY Store, Product_Type

效果很好,我按预期得到了200行。

现在我希望这200行包含其他相关记录信息:Delivery_Windowstart_week

我尝试了以下内容。

SELECT * FROM Table WHERE EXISTS
(SELECT Product_Type, Store, Min(Despatch_Time) as MinDes
FROM table
GROUP BY Store, Product_Type)

我尝试过做内部和右部连接都返回了超过200条记录,我的原始数量。

我检查了附加记录,这是商店和产品类型的发货时间相同但发货类型不同的情况。

所以我需要创建一个查询,我通过初始子查询限制它,但即使有匹配的最小发送时间,它仍然会按商店和产品类型将计数限制为一个记录。

当前查询是:

SELECT *
FROM table AS A INNER JOIN 
(Select Min(Despatch_Time) as MinDue, store, product_type
FROM table
WHERE day_num = [Forms]![FRM_SomeForm]![combo_del_day] AND start_week =[Forms]![FRM_SomeForm]![txt_date1]
GROUP BY store, product_type) AS B 
ON (A.product_type = B.product_type) AND (A.store = B.store) AND (A.Despatch_Time = B.MinDue);

1 个答案:

答案 0 :(得分:1)

我想你想要:

SELECT t.*
FROM table as t
WHERE t.Dispatch_Time = (SELECT MIN(t2.Dispatch_Time)
                         FROM table as t2
                         WHERE t2.Store = t.Store AND t2.Product_Type = t.Product_Type);

以上将返回重复项。为了避免重复,您需要一个键来提供唯一性。我假设您有一个主键pk

SELECT t.*
FROM table as t
WHERE t.pk = (SELECT TOP (1) t2.pk
              FROM table as t2
              WHERE t2.Store = t.Store AND t2.Product_Type = t.Product_Type
              ORDER BY t2.Dispatch_Time, t2.pk
             );