58

私はこの声明を持っています:

INSERT INTO qa_costpriceslog (item_code, invoice_code, item_costprice)
    VALUES (1, 2, (SELECT item_costprice FROM qa_items WHERE item_code = 1));

item_costpriceの同じデータをコピーする値を挿入しようとしていますが、エラーが表示されます。

Error Code: 1136. Column count doesn't match value count at row 1

どうすればこれを解決できますか?

4

6 に答える 6

99

SELECTステートメント内でエイリアスを持つ数値リテラルを使用します。コンポーネント()の周りは必要ありません。SELECT

INSERT INTO qa_costpriceslog (item_code, invoice_code, item_costprice)
  SELECT
    /* Literal number values with column aliases */
    1 AS item_code,
    2 AS invoice_code,
    item_costprice
  FROM qa_items 
  WHERE item_code = 1;

のコンテキストではINSERT INTO...SELECT、エイリアスは実際には必要ではなく、単にできますSELECT 1, 2, item_costpriceが、通常SELECTは、返された列にアクセスするためにエイリアスが必要になることに注意してください。

于 2012-05-17T22:09:25.093 に答える
12

あなたは単に例えば

INSERT INTO modulesToSections (fk_moduleId, fk_sectionId, `order`) VALUES
    ((SELECT id FROM modules WHERE title="Top bar"),0,-100);
于 2015-09-17T16:03:15.930 に答える
3

「オールオアナッシング」の答えにがっかりしました。私は(再び)INSERTいくつかのデータと既存のテーブルからのSELECTデータを必要としていました。id

INSERT INTO table1 (id_table2, name) VALUES ((SELECT id FROM table2 LIMIT 1), 'Example');

クエリの副選択では、INSERTデリミネータとしてコンマに加えて括弧を使用する必要があります。

SELECT内での使用に問題がある場合は、最初に個別にテストし、両方のクエリで正しい列数が一致することを確認することINSERTをお勧めします。SELECT

于 2018-11-12T00:31:10.467 に答える
2

挿入ステートメントの左側の列が多すぎるか、右側の列が不足しています。VALUESの前の部分には7つの列がリストされていますが、VALUESの後の2番目の部分には1、2の3つの列しか返されません。その後、サブクエリは1つの列のみを返します。

編集:まあ、誰かがクエリを変更する前にそれはしました...

于 2012-05-17T22:13:04.750 に答える
0

Michael Berkowskiの良い答えの補足として、次のようにフィールドを動的に追加することもできます(または、phpスクリプトを使用している場合はフィールドを準備することもできます)。

   INSERT INTO table_a(col1, col2, col3)
     SELECT
       col1,
       col2,
       CURRENT_TIMESTAMP()
     FROM table_B 
     WHERE b.col1 = a.col1;

新しいデータを追加せずに転送する必要がある場合は、プレースホルダーとしてNULLを使用できます。

于 2019-09-28T13:09:06.587 に答える
0

追加する文字列値が複数ある場合は、それらを一時テーブルに配置してから、必要な値と相互結合できます。

-- Create temp table    
CREATE TEMPORARY TABLE NewStrings (
        NewString VARCHAR(50)
    );
-- Populate temp table
INSERT INTO NewStrings (NewString) VALUES ('Hello'), ('World'), ('Hi');

-- Insert desired rows into permanent table
INSERT INTO PermanentTable (OtherID, NewString)
    WITH OtherSelect AS (
        SELECT OtherID AS OtherID FROM OtherTable WHERE OtherName = 'Other Name'
    )
    SELECT os.OtherID, ns.NewString
    FROM OtherSelect os, NewStrings ns;

このように、文字列を1つの場所で定義するだけでよく、クエリを1つの場所で実行するだけで済みます。私が最初に行ったように、そしてElendurwenとJohnが提案したようにサブクエリを使用した場合は、すべての行にサブクエリを入力する必要があります。ただし、このように一時テーブルとCTEを使用すると、クエリを1回だけ記述できます。

于 2022-01-13T01:41:14.653 に答える