2013-03-22 45 views
-1

我有两个表:内部查询难写

customerschema_id

架构表有:schema_id, period, amt, updated_date

我需要加入的客户和架构,但只检索最新记录加盟而不是其他人。

customer table 

cust_id name schema_id 
1  ABC 1 

架构表

schema_id period amt updated_date 
1   1  100 2010-4-1 
1   2  150 2011-4-1 
+1

请通过添加适当的标记(Oracle,SQL Server,MySQL等)来指定您要定位的RDBMS。可能会有利用不被普遍支持的语言或产品功能的答案。此外,通过为特定的RDBMS添加标签,您的问题可能会得到更适合回答的人的关注。 – Taryn 2013-03-22 19:35:44

+0

我正在使用mysql – 2013-03-22 19:37:24

回答

5

如果您需要max(updated_date)每个schema_id,那么你可以使用一个子查询:

select c.cust_id, c.name, c.schema_id, s.period, s.amt, s.updated_date 
from customer c 
inner join 
(
    select s1.schema_id, s1.period, s1.amt, s1.updated_date 
    from `schemas` s1 
    inner join 
    (
    select schema_id, max(updated_date) MaxDate 
    from `schemas` 
    group by schema_id 
) s2 
    on s1.schema_id = s2.schema_id 
    and s1.updated_date = s2.maxdate 
) s 
    on c.schema_id = s.schema_id 

SQL Fiddle with Demo

然后,子查询使用在连接回你的表中返回行具有匹配的日期和schema_id。

+0

t1没有更新日期 – 2013-03-22 19:40:25

+0

@AbhijitShelar你是什么意思't1'没有'updated_date'? 'updated_date'在你的表中。这是通过自连接来获取每个'schema_id'和'max(updated_date)'的行。 – Taryn 2013-03-22 19:43:56

+0

第一个表只有schema_id作为其中一列 – 2013-03-22 19:44:41

0

如果我理解你的问题,你需要采取最新的“架构”注册。

我认为你需要使用max()函数。因此,请尝试下面的查询:

select * 
from customer c, 
    schema s 
where c.schema_id = s.schema_id 
    and s.updated_date = (select max(s2.updated_date)  
         from schema s2 
         where s2.schema_id = s.schema_id 
         ) 

问候!

埃德米尔顿

+2

请始终显式指定您的连接,请勿使用隐式连接语法(逗号分隔的'FROM'子句)。除此之外,它使得关于某些连接条件的推理非常困难。 – 2013-03-22 19:55:52

+0

@ Clockwork-Muse哦,是的,绝对。我可能写了一些关于此:http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx – 2013-03-22 19:59:18

+0

感谢您的提示Clockwork-Muse和@ aaron-bertrand。但我认为这是主观的!顺便说一句,我会读到的,包括亚伦的帖子! – Edmilton 2013-03-22 20:24:05