Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 用查找表中的值重新组合连接的列表_Sql Server 2008 - Fatal编程技术网

Sql server 2008 用查找表中的值重新组合连接的列表

Sql server 2008 用查找表中的值重新组合连接的列表,sql-server-2008,Sql Server 2008,我有两个表,T1和T2。我想联接这两个表,只返回2行数据,用T2中的查找值替换Item中的整数 表T1 Item Date ------ --------- 1;4;5; 3/13/2013 1;2;3; 3/13/2013 表T2 ID Desc ---- ------ 1 Tree 2 Grass 3 Sand 4 Water 5 Bridge 预期成果: Item Date ---------

我有两个表,
T1
T2
。我想联接这两个表,只返回2行数据,用
T2
中的查找值替换
Item
中的整数

T1

Item    Date
------  ---------
1;4;5;  3/13/2013
1;2;3;  3/13/2013
T2

ID    Desc
----  ------
1     Tree
2     Grass
3     Sand
4     Water
5     Bridge
预期成果:

Item                 Date 
------------------   ---------
Tree;Water;Bridge;   3/13/2013
Tree;Grass;Sand;     3/13/2013

首先,创建一个Split函数,该函数返回一个整数和一个保序序列号。以下是一个例子:

ALTER FUNCTION dbo.SplitInts
(
    @List       VARCHAR(MAX),
    @Delimiter  VARCHAR(32)
)
RETURNS TABLE
AS
    RETURN 
    (
      SELECT rn = ROW_NUMBER() OVER (ORDER BY Number), 
      Item = CONVERT(INT, Item)
        FROM (SELECT Number, Item = LTRIM(RTRIM(SUBSTRING(@List, Number, 
          CHARINDEX(@Delimiter, @List + @Delimiter, Number) - Number)))
        FROM (SELECT ROW_NUMBER() OVER (ORDER BY [object_id])
          FROM sys.all_objects) AS n(Number)
        WHERE Number <= CONVERT(INT, LEN(@List))
        AND SUBSTRING(@Delimiter + @List, Number, 1) = @Delimiter
      ) AS y
    );
GO
强烈建议您查找规范化。分号分隔的列表是将独立值塞进一起的可怕方式

DECLARE @t1 TABLE
(
 Item VARCHAR(MAX),
 [Date] DATE -- terrible column name!
);

INSERT @t1 VALUES('1;4;5;','20130313'),('1;2;3;','20130313');
-- please use unambiguous date formats!

DECLARE @t2 TABLE
(
 ID INT, -- another bad column name - what kind of ID?
 [Desc] VARCHAR(255)  -- another bad column name, this is a keyword!
);

INSERT @t2 VALUES(1,'Tree'),(2,'Grass'),
(3,'Sand'),(4,'Water'),(5,'Bridge');

;WITH x AS
(
  SELECT t1.Item, Date, t2ID = i.Item, i.rn, n = t2.[Desc] 
  FROM @t1 AS t1 CROSS APPLY dbo.SplitInts(t1.Item, ';') AS i
  INNER JOIN @t2 AS t2 ON i.Item = t2.ID
)
SELECT DISTINCT Item = (
  SELECT n + ';' FROM x AS x2 
  WHERE x.Item = x2.Item
  ORDER BY x2.rn FOR XML PATH, TYPE
).value('.[1]', 'varchar(max)'), [Date]
FROM x;