Как запустить второй запрос на основе первого запроса? - PullRequest
3 голосов
/ 10 июня 2019

enter image description here Я использую два запроса, первый разделил один столбец на два столбца и вставил выборку из одной таблицы и второго запроса (PIVOT) на основе вставленной таблицы,

1-й запрос,

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);

2-й запрос

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

Я хочу, чтобы 2-й запрос выполнялся на основе первого запроса, не требуя таблицы.любая помощь будет оценена.

Ответы [ 2 ]

9 голосов
/ 12 июня 2019

Ваш вопрос не очень понятен ... И это очень хороший пример, почему вы всегда должны добавлять 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>.

0 голосов
/ 18 июня 2019

CTE: WITH common_table_expression - ответ

вы можете подготовить некоторые данные в первом запросе, а пользователь - во втором

 WITH cte_table AS
    (
        SELECT  *
        FROM sys.objects
    )
    SELECT *
    FROM cte_table
    where name  like 'PK%'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...