SQL新手 - 子查询

Tau*_*eef 5 sql sql-server sql-server-2012

大家好,这是我的第一个问题,所以对我很轻松 - 需要一些帮助来提取一些数据.

这是我正在使用的两个表:查询表:

+---------------------------------------------------------------------+
| ID (Primary Key) | Author | threadid | created     | Comments       |
+---------------------------------------------------------------------+
| 1                |   C    | 237      | 2016-07-24  | Hi there...    |
| 2                |   T    | 421      | 2015-06-07  | Hello, ..      |
| 3                |   C    | 421      | 2015-06-08  | Hi,...         |
| 4                |   C    | 327      | 2017-03-13  | Hey there..    |
+---------------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

T代表公司向客户发送询问,C代表客户向公司发送询问.

Enquirythreads表:

+----------------------------------+
| ID (Primary Key) |  created      |
+----------------------------------+
| 421              | 2016-07-24    |
| 237              | 2016-07-24    |
| 327              | 2015-06-08    |
+----------------------------------+
Run Code Online (Sandbox Code Playgroud)

我想要的输出是:

+---------+
| ID      |
+---------+
|  421    |
+---------+
Run Code Online (Sandbox Code Playgroud)

我想要所有的enquirythread id,这样与之相关的第一个查询是由作者T完成的.

这是我的代码但不起作用:

SELECT enquirythreads.id
FROM enquirythreads
JOIN enquiries on enquirythreads.id = enquiries.threadid
WHERE enquiries.threadid IN 
    ( SELECT enquiries.threadid as enqid
      FROM 
            ( SELECT enquiries.threadid, min(enquiries.created) as mincreated
            FROM enquiries
            WHERE enquiries.author = 'T'
            GROUP BY enquiries.threadid ) x

     )
Run Code Online (Sandbox Code Playgroud)

Gor*_*off 1

一种方法使用聚合和having

select e.threadid
from enquiries e
group by e.threadid
having min(e.created) = min(case when e.author = 'T' then e.created end)
Run Code Online (Sandbox Code Playgroud)

这表示:“检查最早created日期是否与”的最早日期相同'T'

另一种方法在子句中使用相关子查询where

select et.threadid
from enquirythreads et
where (select e2.author
       from enquiries e2
       where e2.threadid = et.threadid
       order by e2.created asc
       fetch first 1 row only
      ) = 'T';
Run Code Online (Sandbox Code Playgroud)