【问题标题】:Workaround to Left Outer Join adding extra rows, comma separated column instead?Left Outer Join 添加额外行,逗号分隔列的解决方法?
【发布时间】:2012-11-16 17:04:50
【问题描述】:

我对 SQL 很陌生,但热衷于学习(使用 SQL 服务器)。

我的数据表有:

[关键字]、[来源]、[访问]列

关键字列有重复值。

[关键字]中的值示例

google

google analytics

how to use google analytics

bing

bing vs google

我的 KeywordDefinition 表有:

[Keyword Branded ID]     [Keyword Branded Group]

google                 branded google
bing                   branded bing

关键字列只有唯一值,所以这将是关键。

我正在使用 LEFT OUTER JOIN 将 [Keyword Branded Group] 插入到我的数据表中,该表实际上根据每个关键字是否匹配 google 或 bing 为每个关键字分配一个标签。

SELECT 

ISNULL(c1.[Keyword Branded Group],'Other Branded') AS [Keyword Branded Group],
a.*

FROM [mychoice-data-b9BwZvd] a

LEFT OUTER JOIN [mychoice-keyworddims] c1 ON a.[Keyword] LIKE '%'+ c1.[Keyword Branded ID] +'%'

但是,我的问题是,基于“bing vs google”同时匹配 Google 和 Bing 的事实,这会导致额外的行。反正这是我的理解。

有人建议我可以保留数据表中的原始行数,并将新列 [Keyword Branded Group] 作为逗号分隔值 'Branded Google, Branded Bing' 而不是以更多行结束。

遗憾的是他们没有说更多,而且我不知道要查找哪些 SQL 命令!任何人都可以帮忙吗?我只需要有人指出我正确的方向!

谢谢!

【问题讨论】:

    标签: sql-server left-join


    【解决方案1】:

    我能想到的最好方法是将外连接移动到 UDF 中。首先创建一个类似

    的函数
    CREATE FUNCTION dbo.GetAllKeywords (@Keyword varchar(max)) RETURNS varchar(max)
    AS BEGIN
        DECLARE @return varchar(max)
        SET @return = ''
    
        SELECT @return = @return + ',' + [Keyword Branded Group]
        FROM KeywordDefinition
        WHERE @Keyword LIKE '%'+ [Keyword Branded ID] +'%'
    
        IF (LEN(@return) > 2)
            RETURN substring(@return, 2, len(@return) - 2)
        ELSE
            RETURN 'Other Branded'
    END
    

    然后您可以将 UDF 作为子查询放入:

    SELECT dbo.GetAllKeywords(a.Keyword), a.*
    FROM [mychoice-data-b9BwZvd] a
    

    【讨论】:

    • 不错的解决方案。您可以通过这样做消除前导逗号: SET return = null; SELECT @return = coalesce(@return + ', ', '') + [KeywordBrandedGroup]
    • 嗨戴安娜,谢谢!我现在正在尝试(星期一早上新鲜大脑!;-))但我收到错误“函数中包含的最后一条语句必须是返回语句”
    猜你喜欢
    • 2010-12-15
    • 1970-01-01
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-01
    • 2010-10-04
    • 1970-01-01
    相关资源
    最近更新 更多