Как вставить строки данных по порядку с помощью оператора MERGE? - PullRequest
0 голосов
/ 03 мая 2018

Я бы хотел, чтобы вставленные строки были в том же порядке, что и в утверждение выбора источника - то есть ORDER BY TMP.DEF_DATA_SK. Но они вставлено несколько случайно.

С помощью Simple Вставить в оператор Select это можно сделать, но я хочу, чтобы это было сделано с помощью 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 голосов
/ 03 мая 2018

Нет гарантии порядка вставки строк в таблицу.

Однако, если ваша таблица имеет первичный ключ, записи будут упорядочены по первичному ключу, поскольку при создании первичного ключа он также создаст кластерный индекс для таблицы на основе этого первичного ключа. Если первичный ключ определен как идентификатор, единственная гарантия состоит в том, что значения идентификатора будут сгенерированы на основе предложения ORDER BY.

Но если вы не хотите помещать первичный ключ в таблицу, вы можете просто создать кластерный индекс для таблицы на основе столбца. Существуют и другие проблемы с кластерным индексом, которые следует учитывать исходя из ваших потребностей. Пожалуйста, посмотрите на кластерный индекс следующим образом

https://docs.microsoft.com/en-us/sql/relational-databases/indexes/clustered-and-nonclustered-indexes-described?view=sql-server-2017

чтобы вы могли хранить строки, как вы ожидали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...