sqlite3仅在其他4个列匹配的情况下用另一个表中的数据更新表

时间:2013-09-17 16:45:57

标签: sql sqlite sql-update

我希望有人可以帮助我。我研究了一下,但无法找到我想要的确切答案。

我有两张桌子:

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

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

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

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

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

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

非常感谢任何帮助。

1 个答案:

答案 0 :(得分: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 update syntax解决问题。 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。链接问题的currently accepted answer显示了解决SQL Server,Oracle,MySQL和ANSI问题的不同方法。