Sql 以逗号分隔的字符串中缺少值搜索

Sql 以逗号分隔的字符串中缺少值搜索,sql,sql-server,tsql,Sql,Sql Server,Tsql,如果在sql中可能,请帮助我。 大家好,请大家分享一下他们的专业知识,我不太确定在SQL中是否可行 表格大小:5GB 我试图看到给定产品线的子表中存在无效的验证\u ID 因此,在下面的场景中,114不存在于主表中的产品线被动中,而是存在于子表中 DECLARE @CHILD TABLE ( PRODUCT_LINE VARCHAR (50), COMPONENT VARCHAR (50), MODEL VARCHAR (50), YEARS VARCHAR (50), VA

如果在sql中可能,请帮助我。

大家好,请大家分享一下他们的专业知识,我不太确定在SQL中是否可行

表格大小:5GB

我试图看到给定
产品线的子表中存在无效的
验证\u ID

因此,在下面的场景中,114不存在于主表中的
产品线
被动中,而是存在于子表中

DECLARE @CHILD TABLE
(
  PRODUCT_LINE VARCHAR (50),
  COMPONENT VARCHAR (50),
  MODEL VARCHAR (50),
  YEARS VARCHAR (50),
  VALIDATION_ID VARCHAR (50)
)

INSERT @CHILD

SELECT 'PASSIVE','RESISTOR','CARBON','2005','V114' UNION ALL
SELECT 'PASSIVE','RESISTOR','CARBON','2005','V098, E009, V034'  UNION ALL
SELECT 'PASSIVE','RESISTOR','CARBON','2005','V201'  UNION ALL
SELECT 'PASSIVE','RESISTOR','CARBON','2005','V201,V098,V114' UNION ALL
SELECT 'PASSIVE','RESISTOR','CARBON','2005',null  UNION ALL
SELECT 'PASSIVE','RESISTOR','CARBON','2005','null,V098,E009'  UNION ALL
SELECT 'PASSIVE','RESISTOR','CARBON','2005','null,V114'  UNION ALL

SELECT * FROM @CHILD

DECLARE @PARENT TABLE
(
  PRODUCT_LINE VARCHAR (50),
  VALIDATION_ID VARCHAR (50)
)

INSERT @PARENT

SELECT 'PASSIVE','V098' UNION ALL
SELECT 'PASSIVE','E009' UNION ALL
SELECT 'PASSIVE','V201' UNION ALL
SELECT 'PASSIVE','V034' 
预期产出

 PRODUCT_LINE        COMPONENT    MODEL    YEARS    VALIDATION_ID  INVALID_VALIDATION_ID
 PASSIVE              RESISTOR    CARBON    2005    V114           V114
 PASSIVE              RESISTOR    CARBON    2005    V201,V098,V114 V114
'PASSIVE','RESISTOR','CARBON','2005','null,V114',V114

谢谢……

您肯定需要CSV拆分器。有很多,只要搜索一下就可以了。我用的是杰夫的

如果有多个无效ID,它将显示为多行。如果希望多个无效ID显示为CSV,则需要额外的查询来连接它。如果你需要,请告诉我

编辑:更新查询以在CSV中显示无效ID

; WITH
CTE AS
(
    SELECT  c.*, INVALID_VALIDATION_ID = v.Item, 
        RN = DENSE_RANK() OVER (ORDER BY PRODUCT_LINE, COMPONENT, MODEL, YEARS, VALIDATION_ID)
    FROM    @CHILD c
            CROSS APPLY dbo.DelimitedSplit8K(c.VALIDATION_ID, ',') v
    WHERE   c.VALIDATION_ID IS NOT NULL -- edit [2]
    AND     NOT EXISTS
        (
            SELECT  *
            FROM    @PARENT p
            WHERE   p.PRODUCT_LINE  = c.PRODUCT_LINE
            and p.VALIDATION_ID = LTRIM(v.Item)
        )
)
SELECT  DISTINCT 
    PRODUCT_LINE, COMPONENT, MODEL, YEARS, VALIDATION_ID,
    INVALID_VALIDATION_ID   = STUFF(csv, 1, 1, '')
FROM    CTE c
    CROSS APPLY
    (
        SELECT  ',' + x.INVALID_VALIDATION_ID
        FROM    CTE x
        WHERE   x.RN    = c.RN
        ORDER BY INVALID_VALIDATION_ID
        FOR XML PATH('')
    ) i (csv)

你需要试试这个

SELECT *
FROM 
(
    SELECT  c.*, INVALID_VALIDATION_ID = x.Value
    FROM    @CHILD c
    CROSS APPLY dbo.Split(c.VALIDATION_ID, ',') x
    WHERE   NOT EXISTS
    (
        SELECT  *
        FROM    @PARENT p
        WHERE   p.PRODUCT_LINE  = c.PRODUCT_LINE
       and p.VALIDATION_ID = x.Value
    )  
) AS Q
WHERE INVALID_VALIDATION_ID IS NOT NULL AND  INVALID_VALIDATION_ID != 'null'
这里dbo.split函数是

CREATE FUNCTION [dbo].[Split]
(@List varchar(8000),@SplitOn varchar(5))

RETURNS @RtnValue table
(Id int identity(1,1),Value nvarchar(100))

AS
BEGIN
    Set @List = Replace(@List,'''','')
    While (Charindex(@SplitOn,@List)>0)

    Begin
            Insert Into @RtnValue (value)
            Select
            Value = ltrim(rtrim(Substring(@List,1,Charindex(@SplitOn,@List)-1)))

            Set @List = Substring(@List,Charindex(@SplitOn,@List)+len(@SplitOn),len(@List))
    End

    Insert Into @RtnValue (Value)
    Select Value = ltrim(rtrim(@List))

    Return
END

试试这个

如果您有一个规范化的数据模型,这将很容易。@dnoeth:无权更改数据库结构….:(您的
@PARENT
表中的列序列不与
INSERT
statement@Squirrel:更正……谢谢……:)哦,我的。从字面上看
null
我们如何处理null,如果null不存在于父对象中,但存在于子对象中,那么它很好,并且不需要出现在输出中。好心的建议。你是什么意思?例如?例如:对于product line电阻器,子表中存在空值,而父表中不存在空值,则会出现在结果中,但我不希望将空值视为无效的验证id。它不应出现在输出中。一个字符串包含2个有效的验证id和1个空值,然后它不应该出现在输出中,因为我在子表中添加了两行NULL,这两行不应该出现在输出中。
CREATE FUNCTION [dbo].[Split]
(@List varchar(8000),@SplitOn varchar(5))

RETURNS @RtnValue table
(Id int identity(1,1),Value nvarchar(100))

AS
BEGIN
    Set @List = Replace(@List,'''','')
    While (Charindex(@SplitOn,@List)>0)

    Begin
            Insert Into @RtnValue (value)
            Select
            Value = ltrim(rtrim(Substring(@List,1,Charindex(@SplitOn,@List)-1)))

            Set @List = Substring(@List,Charindex(@SplitOn,@List)+len(@SplitOn),len(@List))
    End

    Insert Into @RtnValue (Value)
    Select Value = ltrim(rtrim(@List))

    Return
END