【问题标题】:Add the missing data添加缺失的数据
【发布时间】:2021-10-05 03:08:03
【问题描述】:

首先范围是在SQL Server 2000 兼容性下运行的数据库

我有一个用于拆分字符串的自定义函数

CREATE FUNCTION dbo.splitstring ( @stringToSplit VARCHAR(MAX) )
RETURNS
 @returnList TABLE ([Name] [nvarchar] (500))
AS
BEGIN

 DECLARE @name NVARCHAR(255)
 DECLARE @pos INT

 WHILE CHARINDEX(',', @stringToSplit) > 0
 BEGIN
  SELECT 
    @pos  = CHARINDEX(',', @stringToSplit),  
    @name = SUBSTRING(@stringToSplit, 1, @pos-1)

  INSERT INTO @returnList 
    SELECT ltrim(RTRIM(@name))

  SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos + 1, LEN(@stringToSplit) - @pos)
 END

 INSERT INTO @returnList
    SELECT ltrim(RTRIM(@stringToSplit))

 RETURN
END

效果很好。

现在是我的问题

我有这些数据:

由以下 SQL 产生:

with CTE as
(
  select  '1' CustomerID, 'BCONS1' Code  union 
  select  '1', 'BCONS2'  union 
  select  '2' CustomerID, 'BCONS1' Code  union 
  select  '2', 'BCONS2' 
)
select * 
    from CTE where CustomerID = 1
union 
    select Null, s.Name from dbo.splitstring('ACONS1,ACONS2,ACONS3') S

如何将“缺失”的 CustomerID 添加到我的结果中?

【问题讨论】:

  • 您“缺失”的 CustomerID 的值是多少?如果是1,为什么不` ... select 1, s.Name from dbo.splitstring('ACONS1,ACNS2,ACONS3') S`?
  • 确定您使用的是 SQL Server 2000 吗?根据我在上面使用的 Google-Fu CTE,直到 SQL Server 2005 才受支持。但实际上,您已经很久没有使用受支持的版本了。 2000 已完全在近 8 年中不受支持。
  • 这是一个运行兼容模式 2000 的 SQL Server 2008
  • @Zhorov 我需要为每个客户获取允许位,用于代码 ACONS1、ACNS2、ACONS3。如果缺少其中一个代码,我需要将它们添加到我的选择中
  • @JensBorrisholt 没有理由等待 15 年进行升级。这只会增加运行当前数据库的成本和不可避免的迁移成本。您尝试做的只是所有支持版本中的STRING_SPLIT

标签: sql sql-server tsql sql-server-2008


【解决方案1】:

您可以进行交叉应用,但 Compat 80 级也不支持。但是我们仍然可以强制两个表的笛卡尔积:

with CTE as
(
  select  '1' CustomerID, 'BCONS1' Code  union 
  select  '1', 'BCONS2'  union 
  select  '2' CustomerID, 'BCONS1' Code  union 
  select  '2', 'BCONS2' 
)
select * 
    from CTE where CustomerID = 1
union 
select *
from
   (select distinct 
          CustomerID,  
          s.Value
    FROM CTE 
    , string_split('ACONS1,ACONS2,ACONS3', ',') S
    where CustomerID = 1  -- restrict which rows you need to have added
    ) data    

请注意,我在这里使用了 string_split 而不是您的函数,因为 SEDE 不允许我创建函数。

【讨论】:

  • 谢谢我试试
  • 效果很好。我当然不得不将 string_split 更改为我自己的函数,因为 string_split 需要兼容级别 130
猜你喜欢
  • 2013-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-22
  • 2013-02-15
  • 1970-01-01
  • 2022-01-25
  • 2021-04-06
相关资源
最近更新 更多