【问题标题】:Database Rows into Single Column (From a few tables over)?数据库行到单列(从几个表中)?
【发布时间】:2022-01-07 02:15:57
【问题描述】:

处理一个非常脱节的数据库(必须自己找到每个表的键),需要从中获取一个可行的数据集,这需要为主数据集桥接大约 4 个表。我的问题在表 2 上,每个个人帐户都附加到多个帐户,然后导致状态代码。所以不是想要的:

Person ETC Codes
P1 XXX Code1, Code2, Etc
P2 XXX Code1, Code2, Etc

它改为输出:

Person ETC Codes
P1 XXX Code1
P1 XXX Code2
P2 XXX Code1
P2 XXX Code2

代码目前接近这个:

SELECT P.PersonID, (A few more P.values), CD.Codes
FROM (((Table1 as P 
INNER JOIN Table2 as t2 ON P.PersonID = t2.PersonFID) 
INNER JOIN Table3 as T3 ON T2.ID2 = T3.ID)
INNER JOIN TableCD as CD ON T3.ID2 = CD.ID)

我花了几个小时尝试使用 WHERE PersonID IN(etc) 通过嵌套选择查询和链接它们,但结果大致相同。我也无法通过 GROUP BY 将它们全部设置为相同。我不知道该怎么做,任何帮助将不胜感激。如果已经有答案,我深表歉意,我一直在拉头发并且看了很多,但我可能会错过它。最终目标是创建一个包含所有信息的新表。

【问题讨论】:

  • 请显示示例数据。看起来你需要string_agg()
  • 我很抱歉花了这么长时间,忙碌的周末。您指的是数据样本的哪一部分?和代码一样?

标签: sql database sql-server-2019


【解决方案1】:

如果您使用的是 SQL 2016 或更高版本,有一个非常快速的解决方案,因此 DB 有一个 string_split 函数来返回表数据。返回您需要的结果的查询:

select t1.PERSON, t1.ETC, t2.Value as CODES from table1 t1 
cross apply string_split(t1.CODES, ',') t2;

如果您是 SQL 2016 的早期版本,那么您可以手动创建自己的函数,例如:

CREATE FUNCTION [dbo].StringSplit
(
    @String  VARCHAR(MAX), @Separator CHAR(1)
)
RETURNS @RESULT TABLE(Value VARCHAR(MAX))
AS
BEGIN     
 DECLARE @SeparatorPosition INT = CHARINDEX(@Separator, @String ),
        @Value VARCHAR(MAX), @StartPosition INT = 1
 
 IF @SeparatorPosition = 0  
  BEGIN
   INSERT INTO @RESULT VALUES(@String)
   RETURN
  END
     
 SET @String = @String + @Separator
 WHILE @SeparatorPosition > 0
  BEGIN
   SET @Value = SUBSTRING(@String , @StartPosition, @SeparatorPosition- @StartPosition)
 
   IF( @Value <> ''  ) 
    INSERT INTO @RESULT VALUES(@Value)
   
   SET @StartPosition = @SeparatorPosition + 1
   SET @SeparatorPosition = CHARINDEX(@Separator, @String , @StartPosition)
  END    
     
 RETURN
END

之后,您可以在查询中使用它:

select t1.PERSON, t1.ETC, t2.Value as CODES from table1 t1 
cross apply dbo.StringSplit(t1.CODES, ',') t2

【讨论】:

  • 我尝试过这个。 (不得不停止,因为 MS 访问不能很好地配合这个,所以花了一天时间手动组织它,希望将来避免这种情况)。我觉得我错过了一些东西,抱歉我还在学习很多关于 sql 的知识。我看到 access 有一个 split() 版本,但我不确定它是否以这种方式运行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多