0

私は3つのテーブルを持っています。2つのデータは2つのテーブルから取得され、別のテーブルに挿入されます。tbl_idはフィールドIDを保持し、tbl_msgはフィールドmsgを保持します。

tbl_id               tbl_msg

id                   msg
------               --------
1234                 test_msg
5678
9876

これで、希望する出力がtbl_infoにあるはずです。

id    msg
---   -------
1234  test_msg
5678  test_msg
9876  test_msg

クエリを作成しましたが、次のようなエラーが表示されます。サブクエリが複数の行を返します。私の質問は以下の通りです:

INSERT INTO tbl_info(id、msg)VALUES((SELECT id FROM tbl_id)、(SELECT msg FROM tbl_msg))

4

1 に答える 1

1

挿入したい行を正確に返す単一のSELECTステートメントを作成する必要があります。

2つの内部選択では、tbl_idからすべてのIDを返し、tbl_msgからすべてのメッセージを返します。これはあまり意味がありません。

最初にselectを記述します。例:

SELECT tbl_id.id, tbl_msg.msg 
FROM tbl_id
JOIN tbl_msg ON tbl_id.fk = tbl_msg.fk
WHERE (...)

次に、それをINSERTに使用します。

INSERT INTO tbl_info (id, msg)
SELECT tbl_id.id, tbl_msg.msg 
FROM tbl_id
JOIN tbl_msg ON tbl_id.fk = tbl_msg.fk
WHERE (...)

OPのコメントによる更新:

INSERT INTO tbl_info (id, msg)
 SELECT tbl_id.id, single_msg.msg 
 FROM tbl_id
 JOIN (SELECT msg 
      FROM tbl_msg 
      WHERE CURDATE()=DATE_FORMAT(date_time,'%Y-%m-%d') 
      ORDER BY date_time DESC LIMIT 1) as single_msg ON 1=1;

内部選択はtbl_idの各レコードに対して実行されるため、これはあまり効率的ではありません。より効率的な解決策は次のとおりです。

SELECT msg INTO @msg
FROM tbl_msg 
WHERE CURDATE()=DATE_FORMAT(date_time,'%Y-%m-%d') 
ORDER BY date_time DESC LIMIT 1;

INSERT INTO tbl_info (id, msg)
    SELECT tbl_id.id, @msg 
    FROM tbl_id;
于 2011-07-06T10:49:53.247 に答える