【问题标题】:Get data on the basis of comma-separated ids present in row - SQL根据行中存在的逗号分隔 id 获取数据 - SQL
【发布时间】:2013-03-05 08:57:31
【问题描述】:

表 1

                HolId
1   Package17   2,1,5
2   Package13   5,4,3

表 2

 HolId1
    1   New Years Day   2013-01-01 00:00:00.000
    2   Republic Day    2013-01-26 00:00:00.000
    3   Holi            2013-04-27 00:00:00.000
    4   Memorial Day    2013-05-27 00:00:00.000
    5   US Independence 2013-07-04 00:00:00.000
    7   Labour Day  2013-09-02 00:00:00.000

我想显示如下数据

         HolId    HolId1
Package17   2   2   Republic Day    2013-01-01 00:00:00.000
Package17   1   1   New Years Day   2013-04-27 00:00:00.000
Package17   5   5   US Independence 2013-05-27 00:00:00.000
Package13   5   5   US Independence 2013-07-04 00:00:00.000
Package13   4   4   Memorial Day    2013-05-27 00:00:00.000
Package13   3   3   Holi            2013-04-27 00:00:00.000

我的网格将显示如下,我已经弄清楚了

Package17

     Republic Day   2013-01-01 00:00:00.000
    New Years Day   2013-04-27 00:00:00.000
    US Independence 2013-05-27 00:00:00.000

Package13   

    US Independence 2013-07-04 00:00:00.000
    Memorial Day    2013-05-27 00:00:00.000
    Holi            2013-04-27 00:00:00.000

【问题讨论】:

  • 步骤 0) 规范化你的数据。
  • 哪个 RDBMS? SQL Server、MySQL?

标签: sql sql-server sql-server-2008 procedure


【解决方案1】:

这是MySQL的解决方案:

SELECT
T1.Pkg, T2.*
FROM Table2 T2
    JOIN Table1 T1
        ON FIND_IN_SET(T2.HolID1, T1.HolID)

SQL FIDDLE DEMO

这是给SQL SERVER

SELECT
T1.Pkg, T2.*
FROM Table2 T2
    JOIN Table1 T1
        ON CHARINDEX(CAST(T2.HolID1 as varchar), T1.HolID) > 0

SQL FIDDLE DEMO

【讨论】:

  • 如果 id 是两位数比如 29 会有问题
  • @vini 这是因为你在两组中都有 5 个。
  • 不不,问题是如果我在第一个逗号分隔行和第二个表 2 和 8 和 28 中说 28 个 id,那么它也会显示对应于 2 和 8 的数据,因为它们不在第一个表中
【解决方案2】:

最好对表进行非规范化,然后只需一次连接即可获得结果。如果您必须使用当前架构。希望以下代码对您有所帮助。


declare @tempTable table 
     ( Package_Name varchar(100),
       Holid int
       )
declare @SQLString varchar(max) declare @package_name varchar(100) set @SQLString = '' DECLARE @X XML while @SQLString is not null begin set @SQLString = null select top 1 @package_name=package_name, @SQLString = Holid from Package where package_name not in (select package_name from @tempTable) if @SQLString is null break SET @X = CAST('' + REPLACE(@SQLString, ',', '') + '' AS XML) insert into @tempTable SELECT @package_name, t.value('.', 'INT') FROM @x.nodes('/A') as x(t) end select * from @tempTable select A., B.* from @tempTable A inner join HolID1 B on A.Holid = B.HolID1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    相关资源
    最近更新 更多