map_tags
というテーブルがあります。
map_id | map_license | map_desc
そして、そのレコードがmap_tags
レコードへの外部キー参照(1から1)を含む別のテーブル(widgets
):
widget_id | map_id | widget_name
すべてのmap_license
sが一意であるという制約(ただし、map_tags
のキーとして設定されていない)がある場合、map_license
とwidget_name
があると、同じSQLステートメント内でwidgets
に対して挿入を実行するには:
INSERT INTO
widgets w
(
map_id,
widget_name
)
VALUES (
(
SELECT
mt.map_id
FROM
map_tags mt
WHERE
// This should work and return a single record because map_license is unique
mt.map_license = '12345'
),
'Bupo'
)
私信じる私は正しい軌道に乗っていますが、これはPostgresのSQLが正しくないことをすぐに知っています。誰かがそのような単一のクエリを実現する適切な方法を知っていますか?
INSERT INTO widgets
(
map_id,
widget_name
)
SELECT
mt.map_id, 'Bupo'
FROM
map_tags mt
WHERE
mt.map_license = '12345'
使用 INSERT INTO SELECT
バリアント。SELECT
ステートメントに定数を含めます。
PostgreSQLのINSERT
構文は次のとおりです。
INSERT INTO table [ ( column [, ...] ) ]
{ DEFAULT VALUES | VALUES ( { expression | DEFAULT } [, ...] ) [, ...] | query }
[ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]
上記の2行目の終わりにあるqueryオプションに注意してください。
ここにあなたのための例があります。
INSERT INTO
widgets
(
map_id,
widget_name
)
SELECT
mt.map_id,
'Bupo'
FROM
map_tags mt
WHERE
mt.map_license = '12345'
クイックアンサー: "単一レコード"がない場合 "1レコードで設定"がある場合これがJavaScriptの場合: 「1つの値」ではなく「1つの値を持つ配列」。
例では、サブクエリで1つのレコードが返される場合がありますが、レコードの「配列」を1つのパラメーターのみを使用する場所に個別の実際のパラメーターにアンパックしようとしています。
「なぜだ」と頭を抱えるのに数時間かかった。私が非常に似たようなことをしようとしていたので:
これが私のメモです:
tb_table01: (no records)
+---+---+---+
| a | b | c | << column names
+---+---+---+
tb_table02:
+---+---+---+
| a | b | c | << column names
+---+---+---+
|'d'|'d'|'d'| << record #1
+---+---+---+
|'e'|'e'|'e'| << record #2
+---+---+---+
|'f'|'f'|'f'| << record #3
+---+---+---+
--This statement will fail:
INSERT into tb_table01
( a, b, c )
VALUES
( 'record_1.a', 'record_1.b', 'record_1.c' ),
( 'record_2.a', 'record_2.b', 'record_2.c' ),
-- This sub query has multiple
-- rows returned. And they are NOT
-- automatically unpacked like in
-- javascript were you can send an
-- array to a variadic function.
(
SELECT a,b,c from tb_table02
)
;
基本的に、しないでください "[〜#〜] values [〜#〜]"を、配列をアンパックできるvariadic関数と考えますレコードの。 JavaScript関数の場合のように、ここでアンパックする引数はありません。といった:
function takeValues( ...values ){
values.forEach((v)=>{ console.log( v ) });
};
var records = [ [1,2,3],[4,5,6],[7,8,9] ];
takeValues( records );
//:RESULT:
//: console.log #1 : [1,2,3]
//: console.log #2 : [4,5,7]
//: console.log #3 : [7,8,9]
SQLの質問に戻る:
サブ選択に1つの結果しか含まれていないという理由だけで、この機能が存在しないという現実は変わりません。これは「1つのレコードで設定」ではなく「単一のレコード」です。