如何使用MERGE语句按顺序插入数据行?

时间:2018-05-03 08:07:53

标签: sql sql-server sql-server-2008

我希望插入的行的顺序与中的顺序相同 source select语句 - 即ORDER BY TMP.DEF_DATA_SK。但他们是 随机插入。

使用简单的插入选择语句,它可以完成但我希望使用 MERGE 完成。

SQL如下

MERGE 
INTO 
HCI_STD_STAGING.STAGE.DEF_DATA 
TRG 
USING 
     ( SELECT  TMP.DEF_DATA_SK,
              TMP.VAL, 
              TMP.CD,
              TMP.DESCR,
              TMP.DEF_TP_SK TYPE_SK ,--
              TMP.PRN_SK PARENT, --
              PRN.DEF_DATA_SK PRN_SK, PRN.VAL PRN_VAL,
              TYP.DEF_TP_SK
              ,PRN_PRN.VAL DB
              ,ROW_NUMBER() OVER (ORDER BY TMP.DEF_DATA_SK) AS RowNum
       FROM 
       HCI_STD_STAGING.STAGE._DEF_DATA_TMP TMP
       LEFT JOIN HCI_STD_STAGING.STAGE.DEF_TP TYP
       ON TMP.DEF_TP_SK = TYP.CD --TYPE
        LEFT JOIN HCI_STD_STAGING.STAGE.DEF_DATA PRN
         ON TMP.PRN_SK = PRN.VAL  -- SCH
          INNER JOIN HCI_STD_STAGING.STAGE.DEF_DATA PRN_PRN
           ON PRN.PRN_SK = PRN_PRN.DEF_DATA_SK AND TMP.DB = PRN_PRN.VAL --AND 
        TMP.SCH = PRN.VAL
        WHERE TMP.DEF_TP_SK = 'Table Object'

        GROUP BY 
        TMP.DEF_DATA_SK,
              TMP.VAL, 
              TMP.CD,
              TMP.DESCR,
              TMP.DEF_TP_SK  ,
              TMP.PRN_SK ,
              PRN.DEF_DATA_SK , PRN.VAL ,
              TYP.DEF_TP_SK
              ,PRN_PRN.VAL

      --order by TMP.DEF_DATA_SK

    ) SRC
     ON SRC.VAL = TRG.VAL
     AND SRC.PRN_SK = TRG.PRN_SK
     AND SRC.DEF_TP_SK = TRG.DEF_TP_SK
     WHEN NOT MATCHED
     THEN
      INSERT 
      (
      VAL,CD, DESCR, DEF_TP_SK, PRN_SK
      )
      VALUES ( SRC.VAL, SRC.CD,SRC.DESCR,SRC.DEF_TP_SK,SRC.PRN_SK  );

1 个答案:

答案 0 :(得分:0)

无法保证将行插入表中的顺序。

但是,如果您的表具有主键,则记录将按主键排序,因为在创建主键时,它还将基于该主键在表上创建聚簇索引。如果主键定义为标识,则唯一的保证是将基于ORDER BY子句生成标识值。

但是如果您不想将主键放在表上,则可以根据列在表上创建聚簇索引。根据您的需要,还有一些关于聚集索引的问题。请查看聚集索引,如下所示

https://stream.watsonplatform.net/speech-to-text/api/v1/recognize

因此您可以按预期存储行。