1

次のコードには問題がありますが、CTE から返された値を挿入するコードの挿入ステートメントを配置する場所が見つかりませんでした。

insert into ntm (num,comb,0,0,0,0,0,0,0,0,0,0,0,0)
with CTE as (
  SELECT a.ELM_NUM as num, 
         a.N_1 as N1,
         (trim('1.4*'||a.COMBO)||' + ' || '1.6*'||b.COMBO) as com2,
         b.ELM_NUM as num2 
    FROM NTM a cross join ntm b 
    where ((a.Combo='dead' and b.combo='live') or (a.Combo='dead' and b.combo='live')) and a.ELM_NUM=b.ELM_NUM) 

  select num, num2, trim(trim(com2)||' + '||trim(d.combo)), N1, 1.4*N1
    from CTE cross join ntm d
    where (d.elm_num = cte.num) and (position('X',combo)>0 or position('Y',combo)>0 ) 

FlameRobin エンジンによって発生したエラー「トークンが不明です - 行 1、列 27 0

CREATE TABLE NTM
(
ELM_NUM Integer NOT NULL,
COMBO Char(40) NOT NULL,
N_1 Double precision,
N_2 Double precision,
V2_1 Double precision,
V2_2 Double precision,
V3_1 Double precision,
V3_2 Double precision,
M2_1 Double precision,
M2_2 Double precision,
M3_1 Double precision,
M3_2 Double precision,
MT_1 Double precision,
MT_2 Double precision
);
4

1 に答える 1

1

INSERT INTO <table> (<column>[, <column>]*)select ステートメントの前に ( を含む) を追加することで、select ステートメントの結果を挿入できますWITH。クエリがある場合:

WITH a AS (
    SELECT 4 AS ID, 'Item 4' AS NAME FROM RDB$DATABASE
) 
SELECT ID, NAME 
FROM a

ITEMSそして、列IDとを含むテーブルに挿入したいNAME

INSERT INTO ITEMS (ID, NAME) 
WITH a AS (
    SELECT 4 AS ID, 'Item 4' AS NAME FROM RDB$DATABASE
) 
SELECT ID, NAME 
FROM a

これは Firebird 2.5 でも動作しますが、Firebird 2.1 でも動作すると思います。

あなたの編集に基づいて

あなたの構文は単に間違っていinsert into ntm (num,comb,0,0,0,0,0,0,0,0,0,0,0,0)ます: 無効です: 列がなく、 tableにnumあり、列名として指定することは違法です。列リストと値リストを混同しているようです。combntm0INSERT

の構文は次のとおりINSERTです。

INSERT INTO <object> [(col [, col …])]
{VALUES (<val> [, <val> …]) | <select_expr>}

次のようなものを使用しようとします:

INSERT INTO <object> (<val> [, <val> …])
<select_expr>

選択から (into ) 列とnum( into ) 列のみを挿入したい場合は、次を使用する必要があります。ELM_NUMtrim(trim(com2)||' + '||trim(d.combo))COMBO

insert into ntm (ELM_NUM,COMBO)
with CTE as (
    SELECT a.ELM_NUM as num, 
         a.N_1 as N1,
         trim('1.4*'||a.COMBO)||' + ' || '1.6*'||b.COMBO as com2,
         b.ELM_NUM as num2 
    FROM NTM a cross join ntm b 
    where (a.Combo='dead' and b.combo='live' or a.Combo='dead' and b.combo='live') and a.ELM_NUM=b.ELM_NUM
) 
select num, trim(trim(com2)||' + '||trim(d.combo))
from CTE cross join ntm d
where d.elm_num = cte.num and (position('X',combo) > 0 or position('Y',combo) > 0)

他の列を挿入していないため、選択から他の列を削除したことに注意してください(選択リストの列の数は、挿入列リストの列の数と一致する必要があります)。

残りの列を 0 にしたい場合はDEFAULT 0、テーブル定義に a を追加するか、すべての列を0リストして、それらの追加列ごとに選択リストに値を追加する必要があります。

于 2013-09-14T07:53:44.627 に答える