在2个SQL表之间查找匹配的记录

时间:2019-04-19 16:15:08

标签: sql

我有一张桌子,其中包含一个物品,以及我们从中购买物品的主要供应商。

Table 1
-------
item id
supplier id

我还有另一个表,其中记录了这些物品的所有购买时间。

可以从多个供应商处购买商品,因此一个商品可以在表#2中具有多个记录,这些记录具有相同的供应商ID或不同的供应商ID。

po #
item id
supplier id
date purchased

我正在尝试查找表1中每条记录的上次购买商品的时间。

这是我想出的SQL代码,但没有返回我期望的结果。

SELECT 
    K.item_ID, 
    MAX(PurchaseInfo.order_date) AS [Last Purchase Date],
    PurchaseInfo.po_no
FROM 
    Items K
LEFT OUTER JOIN
    (SELECT
         order_date, supplier_id, po_no, item_id 
     FROM
         Purchases
     GROUP BY 
         order_date, supplier_id, po_no, item_id) AS PurchaseInfo ON PurchaseInfo.item_id = K.item_id 
                                                                  AND PurchaseInfo.supplier_id = K.supplier_id
GROUP BY 
    PurchaseInfo.order_date, K.item_id, PurchaseInfo.po_no

3 个答案:

答案 0 :(得分:1)

一种方法是相关子查询:

select i.item_id, i.supplier_id,
       (select max(pi.order_date)
        from purchase_info pi 
        where pi.item_id = i.item_id and
              pi.supplier_id = i.supplier_id
       ) as most_recent_order_date
from items i;

答案 1 :(得分:0)

您应该仅对K.item_id,PurchaseInfo.po_no进行分组(而不对PurchaseInfo.order_date进行分组,否则找不到max()) 如果您不使用聚集功能

,也应该使用DISTINCT而不是group by
SELECT 
   K.item_ID, 
   max(PurchaseInfo.order_date) as [Last Purchase Date],
   PurchaseInfo.po_no
FROM 
   Items K
   left outer join ( 
   select distinct order_date, supplier_id, po_no, item_id 
   from Purchases
  ) as  PurchaseInfo
ON  PurchaseInfo.item_id = K.item_id and PurchaseInfo.supplier_id = K.supplier_id
GROUP BY  K.item_ID ,  PurchaseInfo.po_no

答案 2 :(得分:0)

此查询:

select
  i.item_id,
  max(p.order_date) [Last Purchase Date]
from items i left join purchases p
on p.item_id = i.item_id
group by i.item_id

返回每个项目的最后购买日期。
如果您还想要列po_no,则将其加入purchases

select t.*, p.po_no 
from (
  select
    i.item_id,
    max(p.order_date) [Last Purchase Date]
  from items i left join purchases p
  on p.item_id = i.item_id
  group by i.item_id
) t left join purchases p
on p.item_id = t.item_id and p.order_date = t.[Last Purchase Date]