简体   繁体   English

在SQL联接中-一对多根据上下文多次选择一列

[英]In SQL Joins - one to many select one column multiple times based upon context

I have two tables, one containing records, and one logging date time stamps on when operations have been performed. 我有两个表,一个包含记录,一个包含执行操作时的日志记录日期时间戳。 Example: 例:

CREATE TABLE MyRecord(
  RecNumber INT IDENTITY(1,1) PRIMARY KEY
  ,TaskDetail NVARCHAR(200)
)

CREATE TABLE MyLOG(
  LogID INT IDENTITY(1,1) PRIMARY KEY
  ,DTStamp DATETIME2(2)
  ,TaskName NVARCHAR(10)
  ,RecNumber
  ,FOREIGN KEY ( RecNumber ) references MyRecord(RecNumber ) 
)

So for example if I had 例如,如果我有

|RecNumber|TaskDetail
| 1       | Some Task

|LogID|DTStamp                |TaskName  |RecNumber|
| 1   | 2014-11-11 00:00:00.00|StartTask | 1       |
| 2   | 2014-11-11 00:01:00.00|EndTask   | 1       |

I would like a query to return: 我想查询返回:

|RecNumber|TaskDetail| Start Time             | End Time              |
| 1       | Some Task| 2014-11-11 00:00:00.00 | 2014-11-11 00:01:00.00|

Now I know I could do this with nested select statements to get the start and end time. 现在,我知道可以使用嵌套的select语句执行此操作以获取开始时间和结束时间。 Using a join I could get the start time OR the end time. 使用联接可以获取开始时间或结束时间。 How do I get both without using nested SQL? 在不使用嵌套SQL的情况下如何获得两者? OR - is nested select statements the best way to do this? 或-嵌套选择语句是执行此操作的最佳方法吗?

Maybe I am going about this all wrong. 也许我要解决所有这些错误。

Another way is conditional aggregation: 另一种方法是条件聚合:

select r.recnumber,
       r.taskdetail,
       max(case when l.taskname = 'StartTask' then l.dtstamp end) as start_time,
       max(case when l.taskname = 'EndTask' then l.dtstamp end) as end_time
  from myrecord r
  join mylog l
    on r.recnumber = l.recnumber
group by r.recnumber,
         r.taskdetail

You can do this in various ways. 您可以通过多种方式执行此操作。 Here is a way just using join s, assuming there is at most one matching row of each type: 这是一种使用join的方法,假设每种类型最多有一个匹配行:

select r.*, ls.DTStamp as StartTask, le.DTStamp as EndTask
from MyRecord r left join
     MyLog ls
     on r.recNumber = ls.recNumber and ls.TaskName = 'StartTask' left join
     MyLog le
     on r.recNumber = le.recNumber and le.TaskName = 'EndTask;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM