SQL从表中选择一行,并从另一个表中选择一些最小值

时间:2012-06-21 06:22:48

标签: sql

我想这不是那么难,但我无法得到它。

例如我有表T1

ID    
-----
1000
1001

我有桌子T2

ID      GROUP  DATE
--------------------------
1000    ADSL   2.2.2012
1000    null   3.2.2012
1000    NOC    4.2.2012
1001    NOC    5.2.2012
1001    null   6.2.2012
1001    TV    7.2.2012

我想从T1仅选择GROUP NOC值为T2的行NOC,但仅限于DATE组的最小值T2 {1}}中的{1}}值。

所以我在这种情况下的结果只有1001,因为它的最小DATE 5.2.2012组是NOC

我不想要任何联接,我也不能使用ID(where id=1000 or id=1001)的默认值,因为这只是一些大表的例子。

重要的是我不能使用t1.id = t2.id,因为在我使用它的某些应用程序中,我不能编写整个SQL表达式而只是部分表达式。我只能使用id。

我尝试过类似的事情:

select id 
from t1 
where
   id in (select id from t2 
          where group = 'NOC' 
          and date in (select min(date) from t2 
                       where id in (select id from t1) 
                      )
         )

但这不起作用。

我知道这似乎有点令人困惑,但我真的无法使用where t1.id = t2.id

由于

3 个答案:

答案 0 :(得分:2)

如果T2.ID是引用T1.ID的外键,则您实际上不需要T1表,因为所有ID都只能从T2获取:< / p>

SELECT o.ID
FROM T2 AS o
WHERE EXISTS (
  SELECT MIN(i.DATE)
  FROM T2 AS i
  WHERE i.ID = o.ID
  HAVING MIN(i.DATE) = o.DATE
)
WHERE o."GROUP" = 'NOC'

但如果你坚持要涉及T1,你只需要像这样修改上述内容:

SELECT *
FROM T1
WHERE ID IN (
  SELECT o.ID
  FROM T2 AS o
  WHERE o."GROUP" = 'NOC'
    AND EXISTS (
      SELECT MIN(i.DATE)
      FROM T2 AS i
      WHERE i.ID = o.ID
      HAVING MIN(i.DATE) = o.DATE
    )
)

答案 1 :(得分:0)

你能分多步完成吗?

首先,要获得每个ID的最小日期,您需要:

select id, peoplegroup, min(date)
from t2
group by id

那会给你

1000    ADSL   2.2.2012
1001    NOC    5.2.2012

将此表格调用为t3。

然后做

select id
from t3
where id in (
  select id from t1
)

答案 2 :(得分:0)

试试这个:

select id from t1 where id in
 (select id from t2 where group = 'NOC' and date =
   (select min(date) from t2 where id = t1.id))