sql - 合并到广告订单中

标签 sql sql-server tsql sql-server-2008 merge

我有一个看起来像这样的声明:

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

其中otherTable有一个自动递增的id字段。

我希望插入 someTable 的顺序与 otherTableid 字段的顺序相同,这样 插入不匹配的字段时,id的顺序将被保留。

快速浏览 docs似乎表明没有任何功能支持这一点。

这可能吗,或者是否有其他方法可以满足我的要求进行插入?

编辑:一种方法是向 someTable 添加一个附加字段来捕获排序。如果可能的话我宁愿不这样做。

...经过反射(reflection),上述方法似乎是可行的方法。

最佳答案

我无法在这里说出发问者的要求,因为它没有任何意义。

那么让我们假设一个不同的问题:

假设我有一个没有标识字段的堆表,但它确实有一个“访问”日期字段。
堆表记录人员网页访问,我将其加载到我的数据仓库中。
在此数据仓库中,我想使用代理键“WebHitID”来引用这些关系。
让我们使用 Merge 来执行表的初始加载,然后继续调用它以保持表同步。

我知道,如果我将记录插入到表中,那么我更希望 ID(由识别字段生成)根据我选择的任何排序方式(假设“访问”日期)。
期望整数 ID 与它的创建时间相对于表中的其余记录相关联的情况并不罕见。
我知道情况并不总是 100%,但请容我容一下。

这可以通过合并实现。

使用(感觉像是黑客)TOP将允许在我们的插入中进行排序:

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 (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.
;


您可以看到我选择使用 TOP 9223372036854775807 (最大的整数)来提取所有内容。
如果您有足够的资源来合并更多资源,那么您应该将其分块。
虽然这对我来说是“老套的解决方法”,但它应该能让你到达你需要去的地方。

我已经在一个小样本集上对此进行了测试并验证了它的工作原理。 不过,我还没有研究过它对更大的复杂数据集的性能影响,所以 YMMV 有或没有 TOP。

关于sql - 合并到广告订单中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/884187/

相关文章:

sql-server - 从 SQL Server 中的同一 xml 列获取多个值

sql-server - SQL 服务器 : get weekly deposit changes using recursive CTE

sql-server - delete with join 是否锁定*未*被删除的表?

javascript - Sequelize PostgreSQL : query to see if string is within an array

sql-server - SQL Server float 据类型超出范围

sql - 从 sql 查询中查找序列

sql - String_Split 表的值

php - 如何将文本框中的字符串与数据库行中的密码匹配

mysql - 从另一行中减去一行

sql - postgresql 改变字符变化到字符变化数组