合并并显示来自多个表的数据

时间:2019-06-17 04:45:22

标签: sql sql-server tsql

我有两张桌子,各有几列

编辑:我需要两个表中的数据。如果表1中没有时间戳记的事件,则需要显示中的记录。但是,如果存在与Table2中的时间戳相对应的事件(查询中的startTime)

Table1:                     
Sensor ID   TimeStamp   Payload1    Payload2            

Table2:                     
Sensor ID   TimeStamp   EventName   EventValue  State   

然后将剩下的结果合并到两个表中:

Result:                     
Sensor ID   TimeStamp   Payload1    Payload2    EventName   EventValue  State

我正在尝试找出一个可以给我正确结果集的SQL。

目前,当我尝试时会出现重复的行。结果集如下所示:

Sensor ID   TimeStamp               Payload1    Payload2    EventName   EventValue  State
2           17/06/2019 11:21:47 AM  205.8   237.9   NULL    NULL    NULL
2           17/06/2019 11:21:49 AM  205.8   244.1   NULL    NULL    NULL
2           17/06/2019 11:21:51 AM  205.8   235.8   NULL    NULL    NULL
2           17/06/2019 11:21:51 AM  NULL    NULL    Event1  205.8   Critical

我想要得到的是这样的:

Sensor ID   TimeStamp               Payload1    Payload2    EventName   EventValue  State
2           17/06/2019 11:21:47 AM  205.8       237.9       NULL        NULL    NULL
2           17/06/2019 11:21:49 AM  205.8       244.1       NULL        NULL    NULL
2           17/06/2019 11:21:51 AM  205.8       235.8       Event1      205.8   Critical

我使用的查询看起来像这样

SELECT SensorID,
           [TimeStamp],
           Payload1 AS Payload1,
           Payload2 AS Payload2,
           INTO #TempTable1
    FROM Feed.data
    WHERE AssetId = 1
          AND [TimeStamp] > GETDATE() - 0.05
         ORDER BY [TimeStamp] ASC;

    SELECT E.SensorID,
           E.StartTime AS [TimeStamp],
           ET.Name AS EventName,
           E.EventValue,
           E.State
    INTO #TempTable2
    FROM [Event] E
        JOIN [EventType] ET
            ON E.EventTypeId = ET.Id
    WHERE E.SensorID = 1
          AND ET.Id IN ( 1, 2 )
          AND StartTime > GETDATE() - 0.05
    --AND  E.Severity != 'Normal' 
    ORDER BY [TimeStamp] ASC;

    SELECT CASE
               WHEN T1.SensorID IS NOT NULL THEN
                   T1.SensorID
               ELSE
                   T2.SensorID
           END AS AssetId,
           CASE
               WHEN [TimeStamp] IS NOT NULL THEN
                   TimeStamp
               ELSE
                   EventTimeStamp
           END AS TimeStamp,
           Payload1,
           Payload2,
           T2.EventName,
           T2.EventValue,
           T2.State
    FROM #TempTable1 T1
        FULL OUTER JOIN #TempTable2 T2
            ON T1.TimeStamp = T2.EventTimeStamp
               AND T1.SensorID = T2.SensorID
    ORDER BY [TimeStamp] ASC;

    --Select * from #TempTable1 
    --Select * from #TempTable2 

    DROP TABLE #TempTable1;
    DROP TABLE #TempTable2;

4 个答案:

答案 0 :(得分:0)

使用全部并集,按时间戳分组。

代码:

select Sensor ID   TimeStamp   Payload1    Payload2  
from Table1
Group by Sensor ID, TimeStamp 
Union all
select Sensor ID   TimeStamp   EventName   EventValue  State 
from Table 2
Group by   Sensor ID   TimeStamp

注意:

  1. 您也可以使用并集,并集会删除重复的行。

  2. 全部并不会删除重复的行。

->根据要求使用运算符(全部或全部合并)。

答案 1 :(得分:0)

以下查询应执行您想要的操作

SELECT ISNULL(t1.[SensorID],t2.[SensorID]) AS [AssetId]
        ,ISNULL(t1.[TimeStamp],t2.[TimeStamp]) AS [EventTimeStamp]
        ,t1.[Payload1]
        ,t1.[Payload2]
        ,t2.[EventName]
        ,t2.[EventValue]
        ,t2.[State]
FROM Feed.data t1
OUTER APPLY (                       -- CROSS APPLY in case you need matching records alone
SELECT E.[SensorID]
        ,E.[StartTime] AS [TimeStamp]
        ,ET.[Name] AS EventName
        ,E.[EventValue]
        ,E.[State]
FROM [Event] E
    JOIN [EventType] ET
        ON E.[EventTypeId] = ET.[Id]
WHERE E.[SensorID] = 1
        AND ET.[Id] IN ( 1, 2 )
        AND E.[StartTime] > GETDATE() - 0.05
        AND t1.[TimeStamp] = E.[StartTime]
        AND t1.[SensorID] = E.[SensorID] ) t2
WHERE t1.[AssetId] = 1
    AND t1.[TimeStamp] > GETDATE() - 0.05

ORDER BY ISNULL(t1.[TimeStamp],t2.[TimeStamp]) ASC

答案 2 :(得分:0)

您需要使用联接两个表,然后选择所需的列。 INNER JOIN将返回两个表中都具有Sensor ID的记录。但是,如果您想查看至少在表1中可用的记录,只需将INNER JOIN替换为LEFT JOIN。

SELECT 
[Sensor ID],TimeStamp,
Payload1,Payload2,
EventName,EventValue,State
FROM Table1 A 
INNER JOIN Table2 B ON A.[Sensor ID] = B.[Sensor ID]
-- Above is the basic query. You can now 
-- add filtering with the query as per your requirement as-
WHERE A.[TimeStamp] > GETDATE() - 0.05

答案 3 :(得分:0)

我将使用一个简单的联合查询,并通过分组将两个数据组合在一起。假设数据在哪张表中都没有匹配,这将不管数据在哪张表中都起作用。

select SensorID, [Timestamp],
    max(PayLoad1) PayLoad1,
    max(PayLoad2) PayLoad2,
    max(EventName) EventName,
    max(EventValue) EventValue,
    max([State]) [State]
from (  
    select SensorID, [TimeStamp], PayLoad1, PayLoad2, 
        null EventName, null EventValue, null [State] 
    from table1
    union
    select SensorID, [TimeStamp], null PayLoad1, null PayLoad2, 
        EventName, EventValue, [State] 
    from table2
    ) q
group by SensorID, [Timestamp]