【问题标题】:How to INNER JOIN only one row from second table如何从第二个表中仅 INNER JOIN 一行
【发布时间】:2019-02-08 12:19:34
【问题描述】:

我在连接第二个表中的一行时遇到问题

声明:

 SELECT ART.*, EAN.*
   FROM ART,EAN 
  WHERE ART.ARTNR = ean.unit_artnr
    AND ean.typ = 'LE4';

TABLE EAN 有时有 2 个条目,所以我得到了我的

ART.ARTNR

输出翻倍。

我想不出办法只包含 EAN 中的一行

我尝试使用 group by 但这并不能解决问题,因为我需要 * 选择

样本数据:https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=3f0a57795fdeb6745155a6e823643c40

现在如果我执行我的语句,它会显示 2 次 ART.ARTNR 1234556 和 2 次 23455,但这不应该是每个 ARTNR 应该显示一次的情况

【问题讨论】:

  • 您可以使用分析函数 row_number() 标记第二个表中的行,然后您可以加入行号 = 1 的位置。
  • 在选择中使用distinct
  • @MuhammadWaheed 这不起作用,因为 ART 中有多个条目,我需要所有条目,但如果我像我一样加入 EAN,它会显示一些 ART 条目加倍,因为 EAN 中有 2 个条目
  • 你的示例数据与SQL不对应,ean.typ在哪里?
  • 您可以使用CROSS APPLY,前提是您的 Oracle 版本具有此功能。您使用的是哪个 Oracle 版本?如果有多个匹配项,您想要哪个 EAN 行?

标签: sql oracle join group-by inner-join


【解决方案1】:

避免逗号分隔连接使用显式连接和解析函数row_number()

  SELECT art.*, EAN.*, 
   EAN.unit_artnr "EAN_ARTNR"
   FROM art join 
   (
   select ean_id,ean,unit_artnr,typ,
   row_number() over(partition by typ order by ean_id)rn from ean
   ) EAN on ART.ARTNR = ean.unit_artnr
   WHERE 
    EAN.typ = 'LE4' and EAN.rn=1

【讨论】:

  • 我收到此错误消息:ORA-00923: Schlüsselwort FROM nicht an erwarteter Stelle gefunden 00923. 00000 - “FROM 关键字未在预期的位置找到”
  • @ElfoDerElf 立即查看
  • 还是一样,我已经看到了错误并删除了它:)
  • @ElfoDerElf dbfiddle.uk/… 检查此链接是否有效
  • 应该是 row_number() over(partition by unit_artnr order by null)rn from ean dbfiddle.uk/…
【解决方案2】:
select ART.*, EANC.*
from ART
  inner join (select EAN.EAN_ID,
                     EAN.EAN,
                     EAN.UNIT_ARTNR,
                     EAN.TYP,
                     row_number() over (partition by EAN.UNIT_ARTNR order by EAN.EAN_ID) as "ROWNR" 
              from EAN) EANC on ART.ARTNR = EANC.UNIT_ARTNR
where EANC.ROWNR = 1

@Zaynul 的答案是正确的,但他使用了错误的列进行分区。

在我的示例中,我将EAN 的行按EAN.EAN_ID 排序。如果您想要其他订单,请在此处更改。

您示例中的结果是(您可以省略 ROWNR)

ARTNR   EAN_ID  EAN         UNIT_ARTNR  TYP     ROWNR
23455   5       7771234568  23455       LE4     1
1234556 1       1234        1234556     LE4     1

【讨论】:

  • 如果 EAN 表有 20 个列,我可以让子查询在内部连接处选择,如“select *”吗?
  • EAN.* 应该与列出的所有单列一样工作。 select EAN.*, row_number()...。我喜欢只选择需要的内容,因此明确地编写所有列。
【解决方案3】:

试试

SELECT ART.*, EAN.*, EAN.ARTNR "EAN_ARTNR"
 FROM SUCH.ART ART,(select distinct * from SUCH.EAN) EAN 
 WHERE ART.ARTNR = ean.unit_artnr
 and ean.typ = 'LE4' ;

【讨论】:

  • 这不起作用,因为 ART 中有多个条目,我需要所有这些条目,但如果我像我一样加入 EAN,它会显示一些 ART 条目加倍,因为 EAN 中有 2 个条目
  • 请编辑您的帖子并包含一些示例数据,以便我可以为您提供更多帮助
  • 这仍然给我双倍​​的条目
  • 然后尝试@Zaynul Abadin Tuhin 解决方案
  • 我做了,但这没有通过
猜你喜欢
  • 1970-01-01
  • 2012-09-13
  • 2010-12-21
  • 2012-10-10
  • 2013-03-02
  • 1970-01-01
  • 2015-02-14
  • 1970-01-01
  • 2020-03-01
相关资源
最近更新 更多