0

1 つの大きなブロックで実行しようとしている、以下に示すような挿入ステートメントが多数あります。その特定の挿入ステートメントをスキップして、選択ステートメントの 1 つのリストが null を返すようにクエリに指示する方法はありますか?

    insert into V1144engine.T_edges(edge_id, version, node1_id, node2_id, edge_type_id, created_at, weight,deleted_at) VALUES(V1144ENGINE.S_PK_EDGES.NEXTVAL,0,(Select node_id from V1144engine.T_nodes where node_name = 'Writing an Equation of a Perpendicular Line' and rownum=1),(select node_id from V1144engine.T_nodes where node_name = 'slope'and node_type_id =11),5,SYSDATE,5.318,null);

    insert into V1144engine.T_edges(edge_id, version, node1_id, node2_id, edge_type_id, created_at, weight,deleted_at) VALUES(V1144ENGINE.S_PK_EDGES.NEXTVAL,0,(Select node_id from V1144engine.T_nodes where node_name = 'Writing an Equation of a Perpendicular Line' and rownum=1),(select node_id from V1144engine.T_nodes where node_name = 'vertic'and node_type_id =11),5,SYSDATE,5,null);
4

3 に答える 3

1

ネストされたSELECTs inEXISTS句の述語を複製できます。

INSERT INTO v1144engine.t_edges (
    edge_id
,   version
,   node1_id
,   node2_id
,   edge_type_id
,   created_at
,   weight
,   deleted_at
)
SELECT v1144engine.s_pk_edges.NEXTVAL
,      0
,     (SELECT node_id 
       FROM   v1144engine.t_nodes 
       WHERE  node_name = 'Writing an Equation of a Perpendicular Line'
       AND    ROWNUM = 1)
,     (SELECT node_id
       FROM   v1144engine.t_nodes
       WHERE  node_name = 'slope'
       AND    node_type_id = 11)
,      5
,      SYSDATE
,      5.318
,      TO_DATE(NULL)
FROM   DUAL
WHERE  EXISTS (SELECT NULL
               FROM   v1144engine.t_nodes 
               WHERE  node_name = 'Writing an Equation of a Perpendicular Line')
AND    EXISTS (SELECT NULL
               FROM   v1144engine.t_nodes
               WHERE  node_name    = 'slope' 
               AND    node_type_id = 11);

これらをいくつ持っているかはわかりませんが、別の方法として、セットベースのアプローチとして、次のようにピボットすることもできますか?

INSERT INTO v1144engine.t_edges (
    edge_id
,   version
,   node1_id
,   node2_id
,   edge_type_id
,   created_at
,   weight
,   deleted_at
)
SELECT v1144engine.s_pk_edges.NEXTVAL
,      0
,      MAX(CASE
           WHEN node_name = 'Writing an Equation of a Perpendicular Line'
           THEN node_id
           END)
,      MAX(CASE
           WHEN node_name = 'slope'
           AND  node_type_id = 11
           THEN node_id
           END)
,      5
,      SYSDATE
,      5.318
,      TO_DATE(NULL)
FROM   v1144engine.t_nodes
WHERE  node_name IN ('Writing an Equation of a Perpendicular Line','slope')
HAVING MAX(CASE
           WHEN node_name = 'Writing an Equation of a Perpendicular Line'
           THEN node_id
           END) IS NOT NULL
AND    MAX(CASE
           WHEN node_name = 'slope'
           AND  node_type_id = 11
           THEN node_id
           END) IS NOT NULL
;

(警告: テストされていないコードです。)

于 2012-07-25T19:51:16.220 に答える
1

私はそれをにラップしてselect ... from dual制限しnode1|2_id IS NOT NULLます:

INSERT INTO v1144engine.t_edges (edge_id
                                ,version
                                ,node1_id
                                ,node2_id
                                ,edge_type_id
                                ,created_at
                                ,weight
                                ,deleted_at
                                )
 SELECT *
       FROM (
             SELECT 
                    v1144engine.s_pk_edges.NEXTVAL edge_id
                   ,0                              version
                   , (SELECT node1_id
                        FROM v1144engine.t_nodes
                       WHERE node_name = 'Writing an Equation of a Perpendicular Line'
                         AND ROWNUM = 1)           node1_id
                   , (SELECT node_id
                        FROM v1144engine.t_nodes
                       WHERE node_name = 'slope'
                         AND node_type_id = 11)    node2_id
                   ,5       edge_type_id
                   ,SYSDATE                        created_at
                   ,5.318                          weight
                   ,NULL                           deleted_at
               FROM dual
            )
      WHERE node1_id IS NOT NULL
        AND node2_id IS NOT NULL
;
于 2012-07-25T19:35:02.787 に答える
0

選択を一時テーブルに入れて、そこから動的 SQL を生成しないのはなぜですか?

于 2012-07-25T19:09:00.733 に答える