0

如果我的标题不是很具有描述性,我很抱歉,因为我不知道如何解释我在标题中的 sql 代码中需要什么。

基本上我有 2 个表,有一个submissions表包含invoicenumbertotalexvat. (totalexvatsum所有的part_exvats

livedata表包含invoicenumber,part_codepart_price

我需要做的是返回submissions表中的所有数据,但也包括最昂贵的产品,其中livedata将两个表连接在一起part_codepart_priceinvoicenumber

submissions
invoicenumber   totalexvat
1                     £123.00
2                     £354.00
3                     £453.00


livedata
invoicenumber       part_code        part_price
1                     prt12345         £100.00
1                     prt13643         £20.00
1                     prt63456         £3.00
2                     prt64232         £300.00
2                     prt28258         £54.00
3                     prt64232         £300.00
3                     prt67252         £153.00

我希望我已经解释得很好,希望有人可以帮助我。

4

3 回答 3

0

因此,您可以使用子查询来完成此操作,但存在一些潜在问题。子查询看起来像这样:

SELECT submissions.totalexvat
       ,livedata.part_code
       ,livedata.part_price
FROM submissions
INNER JOIN
(SELECT invoicenumber
        ,MAX(part_price)
FROM livedata
GROUP BY invoicenumber) ld_max
ON submissions.invoicenumber = ld_max.invoicenumber
INNER JOIN livedata
ON ld_max.invoicenumber = livedata.invoicenumber
    AND ld_max.part_price = livedata.part_price

在此示例中,“ld_max”子查询确定每个发票编号最昂贵部分的价格。然后您返回 livedata 表并重新加入以获取与价格对应的 part_code 是什么。

这样做的潜在问题是,如果您有多个具有相同价格的部分,并且该价格是最大值,那么您将获得最终连接返回的这两个部分。如果这不是所需的行为(可能是,问题不清楚),那么您可以通过嵌套子查询并仅提取前 1 个结果来避免这种情况。但是你只是随意地取其中一个部分并排除另一个部分,这似乎不是一个好主意。这也不是一个好主意,因为嵌套子查询本质上很慢,所以我会提防那些。

于 2013-10-11T13:38:03.120 回答
0

我通常做的是添加一个连接条件,并使用子查询检查价格是否等于该商品的最高价格。

像这样的东西:

select * 
from submissions s
inner join livedata l 
    on s.invoicenumber = l.invoicenumber 
    and l.part_price = 
        (select MAX(part_price) 
        from livedata 
        where invoicenumber = l.invoicenumber)
于 2013-10-11T13:31:15.110 回答
0

您应该使用窗口函数 - 即:row_number()

 select * 
 from 
 (
   select submissions.totalexvat,
          livedata.part_code,
          livedata.part_price,
          row_number() over (partition by submissions.invoicenumber order by part_price desc) rn
   from
       submissions
           inner join livedata on submissions.invoicenumber = livedata.invoicenumber
 ) r
 where rn = 1
于 2013-10-11T13:44:49.353 回答