Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.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 o按数字顺序重新排序。我们唯一可以排除的是结果列不需要按字母顺序列出项目。您可以使用charindex()(请参见我的答案)来欺骗它,但如果列表中包含重复项,它会很快崩溃。单靠它自己?不。Conor Cunningham重写的文档明确保证行可以以任何顺序返_Sql_Sql Server_Sql Server 2017 - Fatal编程技术网

Sql o按数字顺序重新排序。我们唯一可以排除的是结果列不需要按字母顺序列出项目。您可以使用charindex()(请参见我的答案)来欺骗它,但如果列表中包含重复项,它会很快崩溃。单靠它自己?不。Conor Cunningham重写的文档明确保证行可以以任何顺序返

Sql o按数字顺序重新排序。我们唯一可以排除的是结果列不需要按字母顺序列出项目。您可以使用charindex()(请参见我的答案)来欺骗它,但如果列表中包含重复项,它会很快崩溃。单靠它自己?不。Conor Cunningham重写的文档明确保证行可以以任何顺序返,sql,sql-server,sql-server-2017,Sql,Sql Server,Sql Server 2017,o按数字顺序重新排序。我们唯一可以排除的是结果列不需要按字母顺序列出项目。您可以使用charindex()(请参见我的答案)来欺骗它,但如果列表中包含重复项,它会很快崩溃。单靠它自己?不。Conor Cunningham重写的文档明确保证行可以以任何顺序返回(“”),这足以让我不相信它。一旦你介绍了原始列表之外的其他数据,好吧,我把新的措辞解读为“保证不被保证”——因此,相信它“起作用”是不明智的,可能会误导,甚至可能有点危险。如果你能证明它有效的唯一证据是你还没有打破它,我根本不会提倡它。人们


o按数字顺序重新排序。我们唯一可以排除的是结果列不需要按字母顺序列出项目。您可以使用
charindex()
(请参见我的答案)来欺骗它,但如果列表中包含重复项,它会很快崩溃。单靠它自己?不。Conor Cunningham重写的文档明确保证行可以以任何顺序返回(“”),这足以让我不相信它。一旦你介绍了原始列表之外的其他数据,好吧,我把新的措辞解读为“保证不被保证”——因此,相信它“起作用”是不明智的,可能会误导,甚至可能有点危险。如果你能证明它有效的唯一证据是你还没有打破它,我根本不会提倡它。人们多年来一直相信order by,然后SQL Server 2005出现并破坏了许多应用程序。
ID  ValueID
1   1,12,14
2   3,5,15
3   2,6,13,16
ValueID   ValueDescription
1         Motor
2         Low
3         Failed
4         New Install
5         New Item
6         Max Value
7         AC Current
8         DC Current
9         Not Reached
10        NA
11        Cutoff
12        Manual
13        Automatic
14        Device Not Found
15        Halt
16        Renew
ID  ValueID       Result
1   1,12,14       Motor,Manual,Device Not Found
2   3,5,15        Failed,New Item,Halt
3   2,6,13,16     Low,Max Value,Automatic,Renew
 SELECT Table1.ValueID,
   Stuff((SELECT ',' + CAST(Table2.Description AS VARCHAR(100))
           FROM Table2
          WHERE Table1.ValueID LIKE Table2.ValueID
            FOR Xml Path('')),1,1,'')
FROM Table1
Select A.* 
      ,B.*
 From  Table1 A
 Cross Apply (
                Select Result = Stuff((Select ',' +B2.ValueDescription 
                  From (
                        Select RetSeq = Row_Number() over (Order By (Select null))
                              ,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)')))
                        From  (Select x = Cast('<x>' + replace(A.ValueID,',','</x><x>')+'</x>' as xml).query('.')) as A 
                        Cross Apply x.nodes('x') AS B(i)
                       ) B1
                  Join  Table2 B2 on B1.RetVal=B2.ValueID
                  Order by RetSeq
                  For XML Path ('')),1,1,'') 
             ) B
ID  ValueID     Result
1   1,12,14     Motor,Manual,Device Not Found
2   3,5,15      Failed,New Item,Halt
3   2,6,13,16   Low,Max Value,Automatic,Renew
IF OBJECT_ID('tempdb..#Table1', 'U') IS NOT NULL 
DROP TABLE #Table1;

CREATE TABLE #Table1 (
    ID INT NOT NULL PRIMARY KEY,
    ValueID VARCHAR(50) NOT NULL 
    );
INSERT #Table1 (ID, ValueID) VALUES
    (1, '1,12,14'),
    (2, '3,5,15'),
    (3, '2,6,13,16');

IF OBJECT_ID('tempdb..#Table2', 'U') IS NOT NULL 
DROP TABLE #Table2;

CREATE TABLE #Table2 (
    ValueID INT NOT NULL PRIMARY KEY,
    ValueDescription VARCHAR(50) NOT NULL 
    );
INSERT #Table2(ValueID, ValueDescription) VALUES
    (1, 'Motor'),
    (2, 'Low'),
    (3, 'Failed'),
    (4, 'New Install'),
    (5, 'New Item'),
    (6, 'Max Value'),
    (7, 'AC Current'),
    (8, 'DC Current'),
    (9, 'Not Reached'),
    (10, 'NA'),
    (11, 'Cutoff'),
    (12, 'Manual'),
    (13, 'Automatic'),
    (14, 'Device Not Found'),
    (15, 'Halt'),
    (16, 'Renew');

--SELECT * FROM #Table1 t1;
--SELECT * FROM #Table2 t2;

--========================================================

SELECT 
    t1.ID,
    t1.ValueID,
    csv.Result
FROM
    #Table1 t1
    CROSS APPLY (
            SELECT 
                Result = STRING_AGG(t2.ValueDescription, ',')
            FROM
                STRING_SPLIT(t1.ValueID, ',') ss
                JOIN #Table2 t2
                    ON CONVERT(INT, ss.value) = t2.ValueID
            ) csv;
ID          ValueID        Result
----------- -------------- -----------------------------------
1           1,12,14        Motor,Manual,Device Not Found
2           3,5,15         Failed,New Item,Halt
3           2,6,13,16      Low,Max Value,Automatic,Renew
-============================================================================
-- This is an idea that I've been kicking around for a little while now. 
-- It's based on the SUSPICION that, when left to it's own devices. STRING_SPLIT
-- will always retun rows in the original order and attaching a row_number() 
-- to the output, right out of the gate, will effectively serve as an "ItemNumber.
--============================================================================

SELECT 
    t1.ID,
    t1.ValueID,
    csv.Result
FROM
    #Table1 t1
    CROSS APPLY (
            SELECT 
                Result = STRING_AGG(t2.ValueDescription, ',') WITHIN GROUP (ORDER BY rs.rn DESC) -- sort in the descending order for no real eason...
            FROM (
                    SELECT 
                        rn = ROW_NUMBER() OVER (ORDER BY (SELECT NULL)),
                        ValueID = CONVERT(INT, ss.value)
                    FROM 
                        STRING_SPLIT(t1.ValueID, ',') ss
                    ) rs
                JOIN #Table2 t2
                    ON rs.ValueID = t2.ValueID
            ) csv;

ID          ValueID       Result
----------- ------------- --------------------------------
1           1,12,14       Device Not Found,Manual,Motor
2           3,5,15        Halt,New Item,Failed
3           2,6,13,16     Renew,Automatic,Max Value,Low
SELECT *,
       STUFF(
         (
           SELECT ',' + ValueDescription
           FROM T2
           WHERE ',' + T1.ValueID + ',' LIKE '%,' + CAST(T2.ValueID AS VARCHAR) + ',%'
           FOR XML PATH('')
         ),
         1, 1, ''
       ) ValueDescription
FROM T1;
+----+-----------+-------------------------------+
| ID |  ValueID  |       ValueDescription        |
+----+-----------+-------------------------------+
|  1 |   1,12,14 | Motor,Manual,Device Not Found |
|  2 |    3,5,15 | Failed,New Item,Halt          |
|  3 | 2,6,13,16 | Low,Max Value,Automatic,Renew |
+----+-----------+-------------------------------+
;WITH explode(ID, ValueID, value, i) AS
(
  SELECT t1.ID,  
    t1.ValueID,
    TRY_CONVERT(int,f.value), 
    CHARINDEX(',' + f.value + ',', ',' + t1.ValueID + ',')
  FROM dbo.Table1 t1
  CROSS APPLY STRING_SPLIT(t1.ValueID, ',') AS f
)
SELECT x.ID, x.ValueID, 
  -- guarantee respect original order:
  Result = STRING_AGG(t2.ValueDescription,',') WITHIN GROUP (ORDER BY x.i)
FROM explode AS x
INNER JOIN dbo.Table2 AS t2
ON x.value = t2.ValueID
GROUP BY x.ID, x.ValueID
ORDER BY x.ID;
;WITH explode(ID, ValueID, value) AS
(
  SELECT t1.ID, t1.ValueID, f.value
  FROM dbo.Table1 t1
  CROSS APPLY STRING_SPLIT(t1.ValueID, ',') AS f
)
SELECT x.ID, x.ValueID, STRING_AGG(t2.ValueDescription,',')
FROM explode AS x
INNER JOIN dbo.Table2 AS t2
ON x.value = t2.ValueID
GROUP BY x.ID, x.ValueID
ORDER BY x.ID;