sql - 如何根据第一个查询运行第二个查询?

标签 sql sql-server tsql

enter image description here我使用两个查询,第一个将一列分隔到两列并插入一个表,第二个查询(PIVOT)基于插入的表提取,

第一个查询,

SELECT A.MDDID, A.DeviceNumber,  
          Split.a.value('.', 'VARCHAR(100)') AS MetReading
      FROM  (
             SELECT MDDID,DeviceNumber,  
                    CAST ('<M>' + REPLACE(Httpstring, ':', '</M><M>') + '</M>' AS XML) AS MetReading  
               FROM  [IOTDBV1].[dbo].[MDASDatas] E
               Where E.MDDID = 49101
             ) AS A CROSS APPLY MetReading.nodes ('/M') AS Split(a);

第二次查询

SELECT * FROM 
        (
           Select ID,MDDID,DeviceNumber,ReceivedDate
            , ROW_NUMBER() OVER(PARTITION BY ID ORDER BY (SELECT 1)) AS ID2
            , SPLT.MR.value('.','VARCHAR(MAX)') AS LIST FROM ( 
                        Select ID,MDDID,DeviceNumber,ReceivedDate
                                    , CAST( '<M>'+REPLACE(MeterReading,',','</M><M>')+'</M>' AS XML) AS XML_MR 
                                    From [dbo].[PARSEMDASDatas] E
                                    Where E.MeterReading is Not Null
                                    )E
                                    CROSS APPLY  E.XML_MR.nodes('/M') AS SPLT(MR)
                                    )A
                                    PIVOT
                                    (
                                        MAX(LIST) FOR ID2 IN ([1],[2],[3],[4],[5],[6],[7],[8])
                                    )PV

我希望根据第一个查询运行第二个查询,不需要表。 任何帮助将不胜感激。

最佳答案

你的问题不是很清楚...这是一个很好的例子,为什么你总是应该添加 MCVE ,包括 DDL、样本数据、自己的尝试、错误输出和预期输出。这次我给你做,下次自己尝试准备这样的MCVE...

如果我理解正确,您的源表包含一个 CSV 列,其中最多包含 8 个(最大值?)值。这可能会更容易解决,不需要将其分解为两个查询,不需要中间表,甚至不需要 PIVOT。

--create a mockup-table to simulate your situation (slightly shortened for brevity)

DECLARE @YourTable TABLE(ID INT,MDDID INT, DeviceNumber VARCHAR(100),MetReading VARCHAR(2000));
INSERT INTO @YourTable VALUES
 (2,49101,'NKLDEVELOPMENT02','DCPL,981115,247484,9409') --the character code and some numbers
,(3,49101,'NKLDEVELOPMENT02','SPPL,,,,,,,,')            --eigth empty commas
,(4,49101,'NKLDEVELOPMENT02','BLAH,,,999,,');           --A value somewhere in the middle

--cte 将返回表原样。唯一的区别是转换为 XML(你也这样做了)

WITH Splitted AS
(
    SELECT ID
          ,MDDID
          ,DeviceNumber
          ,CAST('<x>' + REPLACE(MetReading,',','</x><x>') + '</x>' AS XML) AS Casted
    FROM @YourTable t
)
SELECT s.ID
      ,s.MDDID
      ,s.DeviceNumber
      ,s.Casted.value('/x[1]','varchar(100)') AS [1]
      ,s.Casted.value('/x[2]','varchar(100)') AS [2]
      ,s.Casted.value('/x[3]','varchar(100)') AS [3]
      ,s.Casted.value('/x[4]','varchar(100)') AS [4]
      ,s.Casted.value('/x[5]','varchar(100)') AS [5]
      ,s.Casted.value('/x[6]','varchar(100)') AS [6]
      ,s.Casted.value('/x[7]','varchar(100)') AS [7]
      ,s.Casted.value('/x[8]','varchar(100)') AS [8]
FROM Splitted s;

结果

ID  MDDID   DeviceNumber        1       2       3       4       5       6       7       8
2   49101   NKLDEVELOPMENT02    DCPL    981115  247484  9409    NULL    NULL    NULL    NULL
3   49101   NKLDEVELOPMENT02    SPPL                            
4   49101   NKLDEVELOPMENT02    BLAH                    999                     NULL    NULL

简而言之:

每个 CSV 都被转换成类似于这样的 XML:

<x>DCPL</x>
<x>981115</x>
<x>247484</x>
<x>9409</x>

在 XPath 中使用位置谓词,我们可以调用第一个、第二个、第三个 <x>很容易。

关于sql - 如何根据第一个查询运行第二个查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56521386/

相关文章:

mysql - 我如何计算 Sql Vb.Net 中的唯一行

mysql - MySQL 上的极慢选择查询

sql-server - SSIS 无法映射查找列。 NVARCHAR(MAX) 错误

database - 重构数据库过程的最佳方法是什么?

sql - 批量插入期间会出现其他字符

php - 在 CodeIgniter 的 DATE_FORMAT sql 中必须使用 FALSE

mysql - 在 SQL 中对两行求和(同一表中的前一行和当前行)

c# - 如何从 FromSql 获取计数?

sql - INSTEAD OF INSERT 触发器和标识列使用 View

SQL 服务器 : Update table based on JSON