仅插入 table 不同的行?

Insert into table only distinct rows?

我有温度 table #A 其中包含:

ID        RevID     Designation      ParentID     Amount
--------------------------------------------------------    
100       500       Test1            300          5000
250       500       Test2            360          5000
410       500       Test3            580          5000

我还有一个临时文件 table #B,其中包含:

ID        RevID     Text        Amount
--------------------------------------  
900       500       Test100      6500

我想做的是插入 table #B 中的内容,而不会由于基于 RevID 的左连接而复制行。我只关心将 table #B 中的 RevID 和数量引入 table #A 中的新行,并使其他列与具有来自 [=27 的匹配 RevID 的任何行相同=] #A.

我正在尝试通过以下方式插入此 table:

INSERT INTO #A (ID, RevID, Designation, ParentID, Amount)
    SELECT DISTINCT
        a.ID,
        a.RevID,
        b.Text,
        a.ParentID,
        b.Amount
    FROM 
        #B b
    LEFT JOIN
        #A a ON b.RevID = a.RevID

我的理想结果如下,它添加了从 table #B 到 table #A 的一行,但由于来自 table 的三行而没有添加三次#A 具有相同的 RevID:

ID        RevID     Designation      ParentID     Amount

100       500       Test1            300          5000
250       500       Test2            360          5000
410       500       Test3            580          5000
100       500       Test100          300          6500

我认为我不能使用联合,因为 table #A 可能包含其他 RevID,而且 table #B 不包含与 table #A 相同的列所以我将需要加入 table #B,并且在有匹配 RevID 的地方,只将该行从 table #B 引入到 table #A 一次。

你可以这样做:

INSERT INTO #A (ID, RevID, Designation, ParentID, Amount)
 SELECT
  (SELECT TOP 1 id FROM #A a WHERE a.RevId = b.RevId),
  b.RevID,
  b.Text,
  (SELECT TOP 1 ParentId FROM #A a WHERE a.RevId = b.RevId)
  b.Amount
 FROM 
  #B b

这不太好,但我认为根据您的描述非常符合逻辑。从 B 获取行并保持“其他列与具有来自 table #A”的匹配 RevID 的任何行相同

或者,我可能会建议:

INSERT INTO #A (ID, RevID, Designation, ParentID, Amount)
 SELECT
  a.ID,
  a.RevID,
  b.Text,
  a.ParentID,
  b.Amount
 FROM 
  #B b
  LEFT JOIN
  (
   SELECT a.RevId, MAX(a.ID) ID, MAX(a.ParentID) ParentID
   FROM #A a
   GROUP BY RevId
  ) a ON b.RevID = a.RevID

内部查询从具有任意 ID 和 ParentID 的 #A 中为每个 RevId 获取一行。可以与#B 连接而不创建重复项。

这可以使用 cross apply 到 select 单个匹配行轻松完成:

insert into #a (Id, RevId, Designation, ParentId, Amount)
select a.Id, a.RevId, b.[Text], a.ParentId, b.Amount
from #b b
cross apply (
    select top(1) a.Id, a.RevId, a.ParentId
    from #a a
    where a.RevId=b.RevId
    order by a.Id
)a

考虑到您只关心从#B 到#A 添加不同的 RevID 和 Amount 列,而其余列并不重要,您可以尝试以下查询并检查它是否满足您的所有条件,

INSERT INTO #A (ID, RevID, Designation, ParentID, Amount)
SELECT (SELECT TOP 1 #A.ID FROM #A) ID, a.RevID,(SELECT TOP 1 #A.Designation FROM #A) Designation,(SELECT TOP 1 #A.ParentID FROM #A) ParentID,b.Amount FROM  #B b JOIN #A a ON b.RevID = a.RevID
EXCEPT
SELECT (SELECT TOP 1 #A.ID FROM #A) ID,RevID,(SELECT TOP 1 #A.Designation FROM #A) Designation,(SELECT TOP 1 #A.ParentID FROM #A) ParentID,Amount FROM #A

使用 EXCEPT 将避免#A 中已经存在的行,我们将获得用于插入查询的唯一行。

请参考数据库 Fiddle 更多示例数据:https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=de51af7d0e1e7ff0407c445a301c5560