【问题标题】:SQL How do I update a single row with the first match from multiple tablesSQL如何使用多个表中的第一个匹配更新单行
【发布时间】:2020-06-20 05:21:59
【问题描述】:

我在更新语句中要引用三个表。我需要将某些细节从表 3 移到表 1。但是两者之间没有ID引用。表 3 中的 PK 与表 2 中的 PK 相匹配。我需要根据两个条件进行链接。从表 2 到表 1 的 PK 的 ColumnY 以及在表 2 的 ColumnP 中找到的特定文本。最后一部分是我卡住的地方。我只需要将 Table3 中找到的第一个匹配行复制到 Table1 中即可。

我编写的脚本返回错误“ORA-01427:单行子查询返回多于一行”。我无法弄清楚如何仅复制第一行。我只希望返回第一个匹配的行,因为没有很多重复项,并且可以在之后手动修改。除非有办法排除也可以工作的重复项。

这是我用作基础的。

UPDATE Table1
    SET Table1.ColumnG = (
        SELECT Table3.ColumnH
        FROM 
        Table3,
        Table2
        WHERE Table3.ID = Table2.ID
        and Table2.ColumnY = Table1.ID
        and Table2.ColumnP = 'DETAIL'
);

【问题讨论】:

  • 欢迎来到 Stack Overflow。如果您使用Tour 并阅读How To Ask,然后edit 您的问题以及创建a Minimal, Reproducible Example 所需的详细信息,您将在这里获得更好的体验。具体来说,表结构的相关部分、您迄今为止的尝试、示例数据以及您想要的结果的模型将帮助我们为您提供帮助。
  • 谢谢埃里克。我错过了其中的一部分。我会更新一些代码。
  • 您认为“仅第一行”是什么?随便挑一个匹配的行?然后用MINMAX 取一个值:UPDATE Table1 SET Table1.ColumnG = (SELECT MAX(Table3.ColumnH) ...UPDATE Table1 SET Table1.ColumnG = (SELECT MIN(Table3.ColumnH) ...
  • 您使用的是 1980 年代使用的连接语法,在 SQL 标准引入显式连接之前(1992 年)。不要那样做。这是2020年;使用正确的连接:FROM table3 INNER JOIN table2 ON table3.id = table2.id.
  • 你还没有回答我的问题。您认为“仅第一行”是什么?

标签: sql oracle


【解决方案1】:
    UPDATE Table1
    SET Table1.ColumnG = 
    SELECT * FROM (
        SELECT Table3.ColumnH
        FROM 
        Table3,
        Table2
        WHERE Table3.ID = Table2.ID
        AND Table2.ColumnY = Table1.ID
        AND Table2.ColumnP = 'DETAIL'
    ) WHERE rownum <= 1
);

【讨论】:

  • 对于 Oracle 来说是fetch first row only
  • 我用一些代码更新了我的问题。我从来没有使用过只取第一行。我会检查一下。但它适用于我放置它的位置吗?
  • 您不需要额外的子查询。而且您在SELECT 之前缺少一个括号。 UPDATE Table1 SET Table1.ColumnG = (SELECT Table3.ColumnH ... WHERE rownum = 1)UPDATE Table1 SET Table1.ColumnG = (SELECT Table3.ColumnH ... FETCH FIRST ROW ONLY),后者仅在 Oracle 12c 中可用。 FETCH FIRST ROW ONLY 是标准 SQL,因此如果您的 Oracle 版本具有此功能,则它是限制行的首选方式。
  • 感谢@ThorstenKettner,但 table1 和 table3 之间没有直接链接。数据库是 11 版,是 32 位的。
  • @Chris,代码没有按预期工作。它只更新了表中的一条记录。
猜你喜欢
  • 1970-01-01
  • 2021-02-19
  • 2020-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-16
  • 1970-01-01
相关资源
最近更新 更多