【问题标题】:My conditional join我的有条件加入
【发布时间】:2018-09-05 22:42:23
【问题描述】:

我的 SQL 请求有问题,如果我有 2 个结果,我需要 fr05 的结果,并且只需要这个结果。

SELECT sad.*, pl.*
FROM SalesAndDistrib AS sad 
INNER JOIN Price_List AS pl ON pl.VKORGAU = sad.VBAK_VKORG 
                            AND sad.VBAP_MATNR = pl.MATNR 
                            AND pl.WERKS in ('FR27', 'FR05')

我无法正确解决这个问题。 谢谢您的帮助 最好的问候

【问题讨论】:

  • 您正在使用哪些 dbms? SQL Server、Oracle、MySQL、Postgres 等。请相应标记。
  • 还有一些示例数据和期望的结果将有很长的路要走。
  • 在这种情况下,您可以使用order by pl.WERKS 并仅获取第一个结果

标签: sql join sql-server-2012


【解决方案1】:

这都是未经测试的代码,因为我需要一个数据集来运行它。

SELECT * 
FROM   (SELECT sad.*, 
               pl.*, 
               Row_number() 
                 OVER( 
                   partition BY vbap_matnr 
                   ORDER BY PL.werks ASC) AS row_num 
        FROM   salesanddistrib AS sad 
        INNER JOIN price_list AS pl 
                ON pl.vkorgau = sad.vbak_vkorg 
               AND sad.vbap_matnr = pl.matnr 
               AND pl.werks IN ( 'FR27', 'FR05' )) AS bob 
WHERE  bob.row_num = 1 

这将使用Over Clause 按pl.werks 对所有记录进行分组。 然后选择前 1 个应该给你 fr05 记录,因为 fr05 在 fr27 之前

【讨论】:

  • 可能分区应该超过sad.VBAP_MATNR而不是WERKS
  • @JuanCarlosOropeza 你为什么这么说?
  • 因为 VBAP_MATNR 是某种 ID,对于每个 ID,他可以拥有 ('FR27','FR05') 并且 OP 希望在您的查询中对每个 'FR05' 有偏好,您只返回一个随机的 'FR05'
  • @JuanCarlosOropeza 非常感谢,我更新了答案
  • 因为格式我没有意识到有双重连接条件。分区应该是PARTITION BY VKORGAU, VBAP_MATNR 但是我会留给OP调试他自己的代码。主要思想就在那里。
【解决方案2】:

我认为以下内容相当普遍。

select top (1) sad.*, pl.*
FROM  SalesAndDistrib AS sad 
INNER JOIN Price_List AS pl 
ON pl.VKORGAU = sad.VBAK_VKORG 
AND sad.VBAP_MATNR = pl.MATNR and pl.WERKS in ('FR27','FR05')
Order by pl.werks. --add asc or desc as required

【讨论】:

  • 不,salesanddistrib 中有很多行,但我没有告诉它,
  • 这不是标准 SQL。 @oupepasa:您还没有告诉我们您使用的是哪个 DBMS。这个答案是 T-SQL (SQL Server)。
猜你喜欢
  • 2013-07-25
  • 1970-01-01
  • 2019-01-14
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
  • 2012-10-17
  • 2019-10-31
  • 2020-07-20
相关资源
最近更新 更多