Fundir em ordem de inserção

votos
4

Eu tenho uma declaração de que é algo como isto:

MERGE INTO someTable st
USING
(
    SELECT id,field1,field2,etc FROM otherTable
) ot on st.field1=ot.field1
WHEN NOT MATCHED THEN
    INSERT IGNORE  (field1,field2,etc)
    VALUES (ot.field1,ot.field2,ot.etc)

onde tbl_outra tem uma autoincrementável id campo.

Gostaria que a inserção em SomeTable estar na mesma ordem como o ID de campo de tbl_outra , de tal modo que a ordem de ID de s é mantida quando são inseridos os campos não correspondentes.

Um rápido olhar para os docs parece sugerir que não há recurso para suportar isto.

Isso é possível, ou há outra maneira de fazer a inserção que iria cumprir as minhas necessidades?

EDIT: Uma abordagem a este seria adicionar um campo adicional para SomeTable que capta a ordenação. Eu prefiro não fazer isso, se possível.

... depois de refletir a abordagem acima parece que o caminho a percorrer.

Publicado 19/05/2009 em 18:54
fonte usuário
Em outras línguas...                            


3 respostas

votos
11

Eu não posso falar o que o entrevistador está pedindo aqui porque não faz qualquer sentido.

Então, vamos supor um problema diferente:

Vamos dizer que, em vez disso, que eu tenho um Heap-Table sem identidade-campo, mas ele tem um " Visitou em campo Data".
A Heap-Table registra Visitas webpage Pessoa e eu estou carregando-a no meu armazém de dados.
Neste Data Warehouse eu gostaria de usar o "-chave substituta WebHitID " para fazer referência a essas relações.
Vamos usar Mesclar para fazer a carga inicial da tabela, em seguida, continuar chamando-o de manter as tabelas em sincronia.

Eu sei que se eu estou inserindo registros em uma tabela, então eu prefiro do ID (que estão sendo gerada por uma Identificar-Field) para ser sequencial com base em qualquer ordem-By I escolher (vamos dizer que o " Visitou em " Data ).
Não é incomum que esperar um Integer-ID para correlacionar quando foi criado em relação ao resto dos registros na tabela.
Eu sei que isto não é sempre 100% o caso, mas humor me por um momento.

Isso é possível com Mesclar.

Usando (o que se sente como um truque ) TOP permitirá ordem nossa Insert:

MERGE DW.dbo.WebHit AS Target --This table as an Identity Field called WebHitID.
USING
(
    SELECT TOP 9223372036854775807 --Biggest BigInt (to be safe).
           PWV.PersonID, PWV.WebPageID, PWV.Visited
      FROM ProdDB.dbo.Person_WebPage_Visit AS PWV
     ORDER BY PWV.Visited --Works only with TOP when inside a MERGE statement.
) AS Source
  ON Source.PersonID  = Target.PersonID
 AND Source.WebPageID = Target.WebPageID
 AND Source.Visited   = Target.Visited
WHEN NOT MATCHED BY Target THEN --Not in Target-Table, but in Source-Table.
    INSERT IGNORE  (PersonID, WebPageID, Visited) --This Insert populates our WebHitID.
    VALUES (Source.PersonID, Source.WebPageID, Source.Visited)
WHEN NOT MATCHED BY Source THEN --In Target-Table, but not in Source-Table.
    DELETE --In case our WebHit log in Prod is archived/trimmed to save space.
;


Você pode ver que eu optou por usar TOP 9223372036854775807 (o maior Integer existe) para puxar tudo.
Se você tem os recursos para mesclar mais do que isso, então você deve ser chunking-lo.
Enquanto isso grita " solução hacky " para mim, ele deve chegar onde você precisa ir.

Eu testei isso em um pequeno conjunto de amostras e verificado ele funciona. Não estudei o impacto no desempenho dele em maiores conjuntos complexos de dados, porém, assim YMMV com e sem o TOP.

Respondeu 14/04/2014 em 12:09
fonte usuário

votos
6

Dando seguimento a resposta de MikeTeeVee.

Usando TOP lhe permitirá ORDER BY dentro de uma sub-consulta, no entanto, em vez de TOP 9223372036854775807, eu iria com

SELECT TOP 100 PERCENT 

Não deve chegar a esse número, mas aqui só faz mais sentido e parece mais limpo.

Respondeu 13/01/2015 em 12:17
fonte usuário

votos
0

Por que você se preocupa com a ordem do correspondente ids? Que diferença isso faria a como você consultar os dados? tabelas relacionadas devem ser conectados por meio de chaves primárias e estrangeiras, não foram inseridos registros de pedidos. Tabelas não são inerentemente solicitados um modo particular em bases de dados. Ordem deveria vir do fim da cláusula.

Mais explicação de por que você quer fazer isso pode nos ajudar a orientá-lo para uma solução adequada.

Respondeu 19/05/2009 em 19:09
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more