从Table1中获取按类型过滤的所有记录,其中包含“0x”,并显示Table2中相应的CaseID,DocID和Date。从表2中,只根据最新日期获得前1名记录。
我需要编写一个sql查询来获取输出。请帮助。
表1
ID | Name | Type | Description
1 | A | 0x100 | Description Text 1
2 | B | 0x200 | Description Text 2
3 | C | 0x300 | Description Text 3
4 | D | XYS | Description Text 4
表2
CaseID | DocID | Type | Date
A1 | 1 | 0x100 | 4/28/2014
A2 | 2 | 0x100 | 4/29/2014
A3 | 3 | 0x100 | 4/30/2014
A4 | 4 | 0x100 | 5/1/2014
A5 | 5 | 0x100 | 5/2/2014
A6 | 1 | 0x200 | 3/3/2015
A7 | 2 | 0x200 | 3/1/2015
A8 | 3 | 0x300 | 1/1/2015
A9 | 4 | 0x300 | 1/2/2015
A10 | 5 | 0x300 | 1/3/2015
A11 | 11 | 0x300 | 1/4/2015
结果
ID | Name | Type | Description | CaseID | DocID | Date
1 | A | 0x100 | Description Text 1 | A5 | 5 | 5/2/2014
2 | B | 0x200 | Description Text 2 | A6 | 1 | 3/3/2015
3 | C | 0x300 | Description Text 3 | A11 | 11 | 1/4/2015
答案 0 :(得分:0)
也许以下(测试过!):
SELECT
t1.Name, t1.Type, t1.Description, t2.CaseID, t2.DocID, t2.Date
FROM
(SELECT Type, MAX(Date) AS MaxDate FROM Table2 GROUP BY Type) AS t2max -- FIRST
JOIN table2 AS t2 ON t2max.Type = t2.Type AND t2max.MaxDate = t2.Date -- SECOND
JOIN table1 AS t1 ON t2.Type = t1.Type -- THIRD
WHERE
t2.type LIKE '0x%'
ORDER BY
t1.Name;
好的,解释:首先,查询引擎查看from子句。它有三张表可以连接在一起。第一个是由子查询创建的;它是表2中按日期排名的顶级记录的类型/日期对。第二个是table2的其余部分;我们将这两者结合在一起,以便我们现在可以使用table2中的所有列。然后from子句中的第三个表是table1,我们将它连接到Type列上的当前行源。此时,我们从子查询,table2和table1中获得了包含列的行源。查询引擎接下来会过滤掉我们不想要的行;那些不在期望的“0x%”中的那些' 0x%'格式。 select子句指出我们只需要结果集中来自行源的特定列,因此查询引擎会抓取它们,按照order by子句对它们进行排序,并吐出结果。
答案 1 :(得分:0)
SELECT t.ID
,t.Name
,t.Type
,t.Description
,t2.CaseID
,t2.DocID
,MAX(t2.Date) as DocDate
FROM Table1 AS t
JOIN Table2 t2
ON t.Type = t2.Type
WHERE t.Type like '0x%'
GROUP BY t.ID
,t.Name
,t.Type
,t.Description
,t2.CaseID
,t2.DocID
HAVING t2.Date = MAX(t2.Date)
我能正确读你吗?