首页 > 解决方案 > SQL中如何根据col/result只选择一行

问题描述

这是我的表:

日志

    Id   LogCode
   ---------------
    1    111
    2    222
    3    333
    4    444
    5    555

LogsDetails1

Id LogCode StartTime            EndTime                 NQCode
--------------------------------------------------------------------
1  111     06/01/2019 15:00:00  06/01/2019 15:07:00     14

LogsDetails2

Id LogCode StartTime            EndTime                 NQCode
--------------------------------------------------------------------
1  333     06/03/2019 16:00:00  06/03/2019 16:09:00     15

我希望表Logs中的所有记录都匹配Logdetails1Logdetails2

这就是我使用左连接的原因。

结果是这样的

logId LogCode DetailsLogCode StartTime            EndTime              NQCode
-----------------------------------------------------------------------------    
1     111     111            06/01/2019 15:00:00  06/01/2019 15:07:00     14 
1     111       0                       
2     222       0
3     333       0
3     333     333          06/03/2019 16:00:00  06/03/2019 16:09:00     15
4     444       0
5     555       0

当相同的日志代码存在多个时,我只想从两条记录中获取一条记录,一条具有正确的详细信息日志代码,另一条为 0。我想选择具有适当值的记录。Logsdetail 表中还有更多列。我不想在开始日期、结束日期应用条件。根据界面条件,这些列可能不会出现一段时间。

我只想在日志代码上应用 con。如果我在 Logsdeais 上应用 max,它将获得该值。这可能会给我错误的细节。我不想要列,想要整行。

喜欢

1     111     111            06/01/2019 15:00:00  06/01/2019 15:07:00     14 
1      111     0 

我想显示第一个记录,其中 LogCode 和 DetailsLogCode 都存在而不是第二个。

当没有匹配时,显示。

我想要这样的输出:

logId LogCode DetailsLogCode StartTime            EndTime              NQCode
------------------------------------------------------------------------------    
1       111     111           06/01/2019 15:00:00  06/01/2019 15:07:00     14                 
2       222       0
3       333     333           06/03/2019 16:00:00  06/03/2019 16:09:00     15
4       444       0
5       555       0

标签: sql

解决方案


我不知道您的尝试是什么,但希望以下查询能给您一些想法。

这里发生的是条件分组DetailsLogCode。我也提供了一个count供参考。如果您需要有效组内的最新日志DetailsLogCode,您可以通过选择 max(StartTime) 来实现。

SELECT logId, LogCode, DetailsLogCode, StartTime, EndTime, NQCode, count(*) FROM (SELECT 
  logId, LogCode, DetailsLogCode, StartTime, EndTime, NQCode
FROM LogsDetails1
  JOIN Logs on Logs.Id = LogsDetails1.logId
UNION ALL
SELECT 
  logId, LogCode as LogCode, DetailsLogCode, StartTime, EndTime, NQCode
FROM LogsDetails2
  JOIN Logs on Logs.Id = LogsDetails2.logId) A
  GROUP BY DetailsLogCode, CASE WHEN DetailsLogCode = 0 THEN 1 END
ORDER BY logId;

您可以将此SQL fiddle 用作游乐场。


推荐阅读