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 つの列の一意の組み合わせが 2 つのテーブル間で一致します。

私は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

テーブル 2 に対応する行があるため、行 1 と 2 が更新されています。テーブル 2 には対応する行がないため、行 3 は同じままです。

実際の例については、私の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 に答える