【问题标题】:Updating to combine values and remove one of them using SQL更新以组合值并使用 SQL 删除其中一个
【发布时间】:2019-06-10 12:22:49
【问题描述】:

我正在使用 Advantage SQL 和下面显示的表格(如果您看到附加的第 5 和第 9 项),您会看到 EVID 为 90,官员在两者上都是 IQAONE,但角色是 - 和 T。想要的是,对于现实生活示例中的任何实例,将 Roles 字段设置为 -T (无论如何在此示例中),并删除留下单数 Role 字符的字段。从长远来看,我需要这个来查看 EVID 哪里是一样的,AND PLACE 是一样的,OFFICER 是一样的 TRIDENT 是一样的等等。

有什么想法吗?

【问题讨论】:

标签: sql string-concatenation advantage-database-server


【解决方案1】:

我会创建一个临时表,其中包含 evid、place、officer、三叉戟和所有其他应该不同的字段的不同值:

SELECT
    MIN(item) AS "item"
  , evid
  , place
  , officer
  , trident
  , SPACE(100) AS "roles"
INTO #tmp
FROM table
GROUP BY
  , evid
  , place
  , officer
  , trident

UPDATE #tmp SET roles = '';

在下一步中,您必须聚合角色,因为 ADS 没有 STRING_AGG 函数,您必须使用游标、循环等来执行此操作。

我以前写过这样的代码,例如look here

然后您可以删除整个原始表并从临时表中插入数据。理想情况下,我会在交易中完成这些最后步骤。

BEGIN TRANSACTION;

DELETE FROM table;
-- Assuming the table and the temp table have the same exact fields
INSERT INTO table SELECT * FROM #tmp;

END TRANSACTION;

【讨论】:

  • 谢谢你,詹斯。 #tmp 表位看起来让我走上了正确的轨道,但我在循环的东西上有点挣扎。我知道我想在我的字符串中加入 evid 和(地点或军官或三叉戟或 apident)组合的角色连接,但还没有看到如何。不过我会继续努力。
  • 不,完全卡住了@Jens。嘘
  • 我很乐意提供帮助,但请先写一个关于组合部分的新问题。
【解决方案2】:

您可以使用 where 条件根据 evid 的结果执行删除,然后是结果

select from my_table 
where evid in (
  select  evid, count(*)
  from my_table  
  group by evid 
  having count(*) > 1 
) and roles = 'T'

【讨论】:

  • 谢谢。这可能对删除部分有所帮助,但是当 evid 和(地点或军官或三叉戟或 apident)相同但具有不同的角色角色时,我还需要朝着正确的方向推动将这两个角色合并在一起,所以我以一条记录结束。
  • 你的评论不清楚你应该添加一个清晰的数据样本与你的实际数据和预期的结果..请不要发布图像..将数据样本作为表格文本发布..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-26
  • 1970-01-01
  • 1970-01-01
  • 2020-02-24
  • 2019-09-16
  • 2013-01-01
相关资源
最近更新 更多