1

我希望有人可以在这里帮助我。我进行了一些研究,但无法真正找到我正在寻找的确切答案。

我有 2 张桌子:

Table1
======
Col1 | Col2 | Col3 | Col4 | Col5 | Col6

Table2
======
Col1 | Col2 | Col3 | Col4 | Col5 | Col6

Col5 和 Col6 在 Table1 中为空,但在 Table2 的某些条目中具有值。两个表在所有其他列中都有相同的条目,但它们的排序方式不同。

每个表中前 4 列的组合是唯一的。我想将 Table2.Col5 中的值复制到 Table1.Col5 中,其中其他 4 列的唯一组合在两个表之间匹配。

我正在尝试在 excel 中执行类似于 VLOOKUP 的操作,仅搜索 4 列的匹配组合,以检索其他 2 列的值并更新相关条目。

我确实在这里找到了与 SQL Server 类似的内容:How do I UPDATE from a SELECT in SQL Server? 但同样,这不是我需要的,特别是因为两个表中的行具有相同的顺序。

任何帮助都感激不尽。

4

1 回答 1

0

我假设你有一个这样的表结构:

CREATE TABLE Table1 (
  Col1 INT NOT NULL,
  Col2 INT NOT NULL,
  Col3 INT NOT NULL,
  Col4 INT NOT NULL,
  Col5 INT NOT NULL,
  Col6 INT NOT NULL,

  PRIMARY KEY (Col1, Col2, Col3, Col4)
);

CREATE TABLE Table2 (
  Col1 INT NOT NULL,
  Col2 INT NOT NULL,
  Col3 INT NOT NULL,
  Col4 INT NOT NULL,
  Col5 INT NOT NULL,
  Col6 INT NOT NULL,

  PRIMARY KEY (Col1, Col2, Col3, Col4)
);

你有这样的样本数据:

INSERT INTO Table1 (
  Col1, Col2, Col3, Col4, Col5, Col6
)
VALUES
  (1, 1, 1, 1, 25, 7),
  (2, 2, 2, 2, 8, 9),
  (3, 3, 3, 3, 25, 12);


INSERT INTO Table2 (
  Col1, Col2, Col3, Col4, Col5, Col6
)
VALUES
  (1, 1, 1, 1, 26, 8),
  (2, 2, 2, 2, 9, 10),
  (4, 4, 4, 4, 30, 3);

ANSI 解决方案

您可以使用ANSI 更新语法解决该问题。ANSI 解决方案如下所示:

UPDATE Table1
SET
  Col5 = (
    SELECT Col5
    FROM Table2
    WHERE
      Table1.Col1 = Table2.Col1 AND
      Table1.Col2 = Table2.Col2 AND
      Table1.Col3 = Table2.Col3 AND
      Table1.Col4 = Table2.Col4
  ),
  Col6 = (
    SELECT Col6
    FROM Table2
    WHERE
      Table1.Col1 = Table2.Col1 AND
      Table1.Col2 = Table2.Col2 AND
      Table1.Col3 = Table2.Col3 AND
      Table1.Col4 = Table2.Col4
  )
WHERE EXISTS (
  SELECT *
  FROM Table2
  WHERE
    Table1.Col1 = Table2.Col1 AND
    Table1.Col2 = Table2.Col2 AND
    Table1.Col3 = Table2.Col3 AND
    Table1.Col4 = Table2.Col4
);

最终,Table1 中的数据如下所示:

Col1 Col2 Col3 Col4 Col5 Col6
1    1    1    1    26   8
2    2    2    2    9    10
3    3    3    3    25   12

第 1 行和第 2 行已更新,因为 Table2 中有相应的行。第 3 行保持不变,因为表 2 中没有对应的行。

有关工作示例,请参阅我的SQLFiddle。我在 SQLFiddle 上使用了 SQLLite 的 SQL.js 实现。

坦率地说,ANSI 更新语法很烂。它太糟糕了,以至于每个商业数据库引擎都有自己的扩展语法来简化复杂的更新。

我不知道 SQLite 是否有自己的扩展语法或采用了其他数据库引擎的语法。

SQL Server 解决方案

您提到您尝试了 SQL Server 解决方案。

使用 SQL Server 语法,解决方案将如下所示:

UPDATE Table1
SET
  Col5 = Table2.Col5,
  Col6 = Table2.Col6
FROM Table1
INNER JOIN Table2 ON
  Table1.Col1 = Table2.Col1 AND
  Table1.Col2 = Table2.Col2 AND
  Table1.Col3 = Table2.Col3 AND
  Table1.Col4 = Table2.Col4;

不幸的是,SQLite 不理解它:

SQLite exception: 1, near "FROM": syntax error

该解决方案可能仅适用于 SQL Server。当前接受的对链接问题的回答显示了解决 SQL Server、Oracle、MySQL 和 ANSI 问题的不同方法。

于 2013-09-17T17:30:10.107 回答