【问题标题】:Trying to Sql join on a column with multiple text尝试对具有多个文本的列进行 Sql 连接
【发布时间】:2015-09-17 15:15:37
【问题描述】:

我有一个包含状态的 SQL Server 表和另一个包含状态但单元格中有多个状态的表:

状态表1

           Col 1             Col 2            
Row1      FullName          WA, OH, FL

地理表2

            Col 1            Col 2            
Row1      Washington           WA
Row2        Ohio               OH
Row3       Florida             FL

FinalResultingTable3

           Col 1              Col 2            
 Row1     FullName             WA
 Row2     FullName             OH
 Row3     FullName             FL  

我想要做的是将Geographycol2 表加入Statecol2 表并返回最终表,我基本上为每个状态返回多行。

也许连接不是执行此操作的地方,有没有办法将这些 csv 转换为具有相同全名的行?

感谢您的帮助

尝试查询(Contact 是 State 表):

Select Top 1000
    Ct.fullname, Ct.ActiveLicenses, Geo.state
From 
    datawarehouse.wby_vw_dim.contact Ct
join 
    datawarehouse.wby_vw_dim.geography Geo on Geo.state like '%' + Ct.activelicenses + '%'

这只会无限次返回一个全名

【问题讨论】:

  • 你用的是什么 rdbms?
  • 正确的解决方法是将这些 csv 字段规范化到它们自己的表中。
  • 我认为这个答案会对你有所帮助:[stackoverflow.com/questions/5493510/… [1]: stackoverflow.com/questions/5493510/…
  • 嘿 Marcb 不幸的是,它位于一个数据仓库中,我无法更改 ETL 流程,只能从中查询
  • Row1 是某种 ID 还是仅供参考?因为我不知道你是否加入两个表

标签: sql sql-server join


【解决方案1】:

将连接更改为

on Ct.activelicenses like '%' + Geo.state + '%'

而不是

on Geo.state like '%' + Ct.activelicenses + '%'

【讨论】:

    【解决方案2】:

    玩你的例子...

    select 
      GeographyTable2.column1,
      StateTable1.column1,
      GeographyTable2.column2
    from
      GeographyTable2 left join StateTable1 on 
        StateTable1.column2 like '%'+GeographyTable2.column2+'%';
    

    您可以找到一个 SQL Fiddle 演示 here

    【讨论】:

      【解决方案3】:

      最好的办法是将数据放入相关表中。既然您说您无法修复架构,那么您需要创建一个临时表并将数据拆分出来。然后加入临时表,如果你一开始就正确设计了这些数据。下面是一个示例,说明如何为它们创建临时表的数据:

      CREATE FUNCTION [dbo].[fnSplitString] 
      ( 
          @string NVARCHAR(MAX), 
          @delimiter CHAR(1) 
      ) 
      RETURNS @output TABLE(splitdata NVARCHAR(MAX) 
      ) 
      BEGIN 
          DECLARE @start INT, @end INT 
          SELECT @start = 1, @end = CHARINDEX(@delimiter, @string) 
          WHILE @start < LEN(@string) + 1 BEGIN 
              IF @end = 0  
                  SET @end = LEN(@string) + 1
      
              INSERT INTO @output (splitdata)  
              VALUES(SUBSTRING(@string, @start, @end - @start)) 
              SET @start = @end + 1 
              SET @end = CHARINDEX(@delimiter, @string, @start)
      
          END 
          RETURN 
      END
      
      
      select * from dbo.fnSplitString('q,d,b', ',') split
      create table #test (Id int, mytest varchar (10))
      
      insert into #test
      values (1, 'a,b')
      , (2, 'c,d,e')
      , (3, 'f,g')
      , (4, 'h')
      
      create table #Splitdata (ID int, splitdata varchar (10))
      
      insert into #Splitdata (id, Splitdata)
      select t.id, split.splitdata from #test t
      cross apply dbo.fnSplitString(mytest, ',') split
      

      请注意,我从这里借用了 split 函数: http://www.sqlservercentral.com/blogs/querying-microsoft-sql-server/2013/09/19/how-to-split-a-string-by-delimited-char-in-sql-server/

      一旦您将数据放入#splitdata 表中,您就可以像往常一样使用它作为两个原始表之间的连接表来加入它。s

      【讨论】:

        【解决方案4】:

        我使用递归 cte 来拆分字符串并删除多余的空格。然后加入另一个表。

        Sql Fiddle Demo

        ;with tmp([Col 1], DataItem, [Col 2]) as (  
            select 
                [Col 1], 
                LEFT([Col 2], CHARINDEX( ',', [Col 2]+',')-1), 
                ltrim(rtrim(STUFF([Col 2], 1, CHARINDEX(',',[Col 2]+','), '')))
            from StateTable1
            union all
            select 
                [Col 1], 
                LEFT([Col 2], CHARINDEX(',',[Col 2]+',')-1),
                ltrim(rtrim(STUFF([Col 2], 1, CHARINDEX(',',[Col 2]+','), '')))
            from tmp
            where [Col 2] > ''
        )
        SELECT t.[Col 1], DataItem, g.[Col 1]
        FROM tmp t 
        inner join GeographyTable2 g 
        on t.DataItem = g.[Col 2]
        

        输出

        |    Col 1 | DataItem |      Col 1 |
        |----------|----------|------------|
        | FullName |       WA | Washington |
        | FullName |       OH |       Ohio |
        | FullName |       FL |    Florida |
        

        我用这个example

        【讨论】:

        • 在您的示例中,您返回FullName,但如果是这种情况,您不需要第二张表GeographyTable2
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-09
        • 2021-07-08
        相关资源
        最近更新 更多