【问题标题】:Finding matching records between 2 SQL tables查找 2 个 SQL 表之间的匹配记录
【发布时间】:2019-04-19 16:15:07
【问题描述】:

我有一张表,其中包含一件物品,以及我们购买该物品的主要供应商。

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

【问题讨论】:

  • 更新您的问题添加适当的数据样本和预期结果

标签: sql


【解决方案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;

【讨论】:

  • 这几乎正是我所需要的。如何获取也是purchase_info表中字段的PO#?
  • @L.Levine 。 . .如果您使用的数据库支持横向连接(有时使用apply 引入),那么您可以这样做。否则,您可以使用另一个相关子查询。
【解决方案2】:

你应该只为 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

【讨论】:

  • 这不是返回最近的购买。
  • @L.Levine 尝试更新您的问题添加适当的数据样本.. 和预期的结果..
【解决方案3】:

这个查询:

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]

【讨论】:

  • 您的逻辑不包括按特定供应商进行搜索。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-09
  • 1970-01-01
  • 2012-12-05
  • 2014-04-09
  • 1970-01-01
  • 1970-01-01
  • 2016-09-25
相关资源
最近更新 更多