2016-12-07 3 views
1

Я не могу найти способ объединения/объединения двух простых запросов SQL-запросов из-за требований WHERE и IN.Присоединение двух разных запросов к MySQL, добавив новый столбец

Просто, я хочу результат этого запроса:

SELECT Nationality, MAX(ActorName) as Oldest, 
FROM ACTOR 
WHERE BirthDate IN 
(SELECT MIN(BirthDate) as MinBday FROM ACTOR GROUP BY Nationality) 
GROUP BY Nationality 

Какие результаты в этом:

+------------+--------------+ 
| nationality| oldest  | 
+------------+--------------+ 
| american | brad pitt | 
+------------+--------------+ 
| british | pierce bro | 
+------------+--------------+ 
| italian | monica bellu | 
+------------+--------------+ 

быть соединены с результатом этого запроса:

SELECT Nationality, MAX(ActorName) as Oldest, 
FROM ACTOR 
WHERE BirthDate IN 
(SELECT MAX(BirthDate) as MinBday FROM ACTOR GROUP BY Nationality) 
GROUP BY Nationality 

В результате:

+------------+--------------+ 
| nationality| youngest  | 
+------------+--------------+ 
| american | angelina j | 
+------------+--------------+ 
| british | jason stat | 
+------------+--------------+ 
| italian | paul gia  | 
+------------+--------------+ 

для того, чтобы иметь результирующую таблицу следующий образом:

+------------+--------------+--------------+ 
|nationality | oldest  | youngest  | 
+------------+--------------+--------------+ 
| american | brad pitt | angelina j | 
+------------+--------------+--------------+ 
| british | pierce bro | jason stat | 
+------------+--------------+--------------+ 
| italian | monica bellu | paul gia  | 
+------------+--------------+--------------+ 

примечания: Единственное различие между 2-запросами является MIN (дата рождения) для старейшей даты рождения и MAX (дата рождения) для молодых Дата рождения.

ответ

0

Очень некрасиво SQL может быть следующий, не самый эффективный, только подход.

SELECT 
    t1.Nationality, t1.Oldest, t2.youngest 
FROM (
    SELECT Nationality, MAX(ActorName) as Oldest -- , 
    FROM ACTOR 
    WHERE BirthDate IN 
    (SELECT MIN(BirthDate) as MinBday FROM ACTOR GROUP BY Nationality) 
    GROUP BY Nationality 
) t1 
JOIN (
    SELECT Nationality, MAX(ActorName) as youngest 
    FROM ACTOR 
    WHERE BirthDate IN 
    (SELECT MAX(BirthDate) as MaxBday FROM ACTOR GROUP BY Nationality) 
    GROUP BY Nationality 
) t2 ON t1.Nationality = t2.Nationality 

Или попробуйте это (не проверено):

SELECT 
    Nationality, 
    MAX(CASE WHEN BirthDate = t1.MinBday THEN ActorName ELSE NULL END) as Oldest, 
    MAX(CASE WHEN BirthDate = t1.MaxBday THEN ActorName ELSE NULL END) as youngest 
FROM ACTOR 
JOIN (
    SELECT Nationality, MIN(BirthDate) as MinBday, MAX(BirthDate) as MaxBday 
    FROM ACTOR GROUP BY Nationality) t 
ON ACTOR.Nationality = t.Nationality 
GROUP BY Nationality 
+0

надеялся на прямой (даже если некрасиво) ответ, как это будет работать, но я не упомянул, что я делаю это в доступе MS и для кого-то причины такие запросы всегда заканчиваются словами: 'Синтаксическая ошибка в FROM FROM' – jmigdelacruz

+0

@jmigdelacruz Обновлен мой ответ, еще одна запятая перед' from'. – Blank

+0

спасибо @forward! первый запрос работает хорошо. просто изменилось, 'join' на' left join' и удалил '-,' из 'Oldest -,' – jmigdelacruz

0

Вы можете получить дату рождения и может присоединиться, что непосредственно как

SELECT a.Nationality, MAX(a.ActorName) as Oldest, 
FROM ACTOR a 
JOIN (SELECT Nationality, 
MIN(BirthDate) as MinBday, 
MAX(BirthDate) as MaxBday 
    FROM ACTOR 
    GROUP BY Nationality) xxx 
ON a.Nationality = xxx.Nationality 
AND (a.BirthDate = xxx.MinBday OR a.BirthDate = xxx.MaxBday) 
GROUP BY Nationality; 
Смежные вопросы