2012-06-21 1 views
1

Я полагаю, это не так сложно, но я не могу ее получить.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.

Таким образом, мой результат в этом случае будет только 1001, потому что для его минимума DATE 5.2.2012 Группа NOC!

Мне не нужны никакие соединения, и я не могу использовать значения по умолчанию для идентификаторов (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

Благодаря

+0

Вы получаете ошибку синтаксиса, потому что 'group' является зарезервированным словом? –

+0

нет Я не (настоящее имя поля PEOPLEGROUP), так что это не проблема – Dejan

+0

Я получаю вывод, но мой результат не подходит для этой большой таблицы – Dejan

ответ

2

Если T2.ID внешний ключ ссылки T1.ID, вы на самом деле не нужны T1 таблицы, поскольку все идентификаторы могут быть получены из Только T2

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 
    ) 
) 
+0

спасибо !!! !! – Dejan

0

Вы можете сделать это в несколько этапов?

Прежде всего, чтобы получить минимальную дату каждого идентификатора, вам потребуется:

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 
) 
+0

Дает 1000, а не 1001 –

+0

О, спасибо, похоже, я неправильно понял вопрос. Я искал общую минимальную дату. Я изменил ответ. –

+0

Мы пока не знаем, какой продукт использует OP, но большинство из них отклонит этот первый запрос, потому что 'peoplegroup' не находится в' GROUP BY' или в агрегате. (MySQL - единственный продукт, о котором я знаю, это позволит) –

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)) 
+0

Дает 1000, а не 1001. Кроме того, при добавлении кода выделите его и нажмите кнопку '{}', чтобы мы получили красивое форматирование/выделение кода. –

Смежные вопросы