我有4个表和一个几乎返回我想要的SQL。它包含相关表和中间表的最大日期。最后一个问题得到了回答,但我意识到我需要更多的sql,如果id_aluno外键的相关表中没有记录,则返回null。
table: Aluno
id_aluno nome
1 Bruno
2 Carlos
3 Fernando
table: Serie
id_serie id_aluno descricao
1 1 Tipo A
2 1 Tipo B
3 2 Tipo A
table: Treino
id_treino id_serie data
1 1 2015-12-10
2 2 2015-12-12
3 3 2015-12-10
table: Avaliacao
id_avaliacao id_aluno data_avaliacao
1 1 2015-12-07
2 1 2015-12-01
3 2 2015-12-05
4 2 2015-12-04
我想要以下结果:
nome descricao data data_avaliacao
Bruno TIPO B 2015-12-12 2015-12-07
Carlos TIPO A 2015-12-10 2015-12-05
Fernando null null null
但是下面的SQL并没有给我一个" aluno" (a.nome)如果没有关于相关表的数据。我试过LEFT JOIN,但这不是我想要的方式。
SELECT a.nome, s.descricao, t.data, v.data_avaliacao
FROM aluno a
JOIN serie s
ON s.id_aluno = a.id_aluno
JOIN treino t
ON t.id_serie = s.id_serie
JOIN
( SELECT s.id_aluno
, MAX(t.data) max_data
FROM serie s
JOIN treino t
ON t.id_serie = s.id_serie
GROUP
BY id_aluno
) x
ON x.id_aluno = s.id_aluno
AND x.max_data = t.data
JOIN avaliacao v
ON s.id_aluno = v.id_aluno
WHERE v.data_avaliacao IN
( SELECT MAX(v.data_avaliacao) max_data1
FROM avaliacao v
GROUP
BY id_aluno
)
我希望你能提供帮助。谢谢
答案 0 :(得分:1)
尝试这样的事情
SELECT nome,
descricao,
data,
data_avaliacao
FROM aluno A
LEFT OUTER JOIN serie S
ON A.id_aluno = S.id_aluno
LEFT OUTER JOIN (SELECT s.id_aluno,
Max(t.data) data
FROM serie s
JOIN treino t
ON t.id_serie = s.id_serie
GROUP BY id_aluno) T
ON T.id_aluno = A.id_aluno
LEFT OUTER JOIN (SELECT Max(v.data_avaliacao) data_avaliacao,
id_aluno
FROM avaliacao v
GROUP BY id_aluno) V
ON v.id_aluno = A.id_aluno
答案 1 :(得分:0)
我明白了!
SELECT nome, T.descricao, T.data, data_avaliacao
FROM aluno A
LEFT OUTER JOIN (SELECT s.id_aluno, s.descricao, max(t.data) data
FROM serie s
JOIN treino t ON t.id_serie = s.id_serie
GROUP BY id_aluno) T ON T.id_aluno = A.id_aluno AND A.id_aluno = T.id_aluno
LEFT OUTER JOIN (SELECT max(v.data_avaliacao) data_avaliacao, id_aluno
FROM avaliacao_aluno v
GROUP BY id_aluno) V ON v.id_aluno = A.id_aluno