#sql #oracle
#sql #Oracle
Вопрос:
мои таблицы базы данных:
//TABLE1
tname
-----------
brazil
spain
england
в моей таблице 2:
//Table2
title date
-------------------------
test1 15-jun-2012
test2 16-jun-2012
test3 14-AUG-2011
в моей таблице 3 :
//Table3
Tname title
------------------
brazil test1
brazil test2
spain test3
мой вопрос заключается в том, чтобы найти tname, которые встречаются с 2012 года, что означает 1 января 2012 года
итак, мой запрос
select tname,
NVL(count(*),0) as total
from table1 t1
inner join table3 t3
on t1.tname = t3.tname
inner join table2 t2
on t3.title = t2.title
where (TO_CHAR(date,'yyyy-mm-dd') > '2012-01-01');
ожидаемый результат:
//result
tname total
-------------------
brazil 2
spain 0
england 0
Комментарии:
1. Какой тип данных — дата? сравнение строк на самом деле не то, что вам нужно, не так ли?
Ответ №1:
Вам нужно group by
предложение:
select tname, NVL(count(*),0) as total
from table1 t1 inner join
table3 t3
on t1.tname = t3.tname inner join
table2 t2
on t3.title = t2.title
where (TO_CHAR(date,'yyyy-mm-dd') > '2012-01-01')
group by tname;
Это предполагает, что остальная часть запроса верна.
Комментарии:
1. я не могу протестировать запрос. не знаю почему. но здесь это правильно?
2. @user3664490 … Для меня это выглядит правильно, хотя
nvl()
это избыточно.count(*)
не возвращаетNULL
.
Ответ №2:
Сравнение строк даты обычно не приводит к тому, что вы действительно хотите. и требуется group by или должна быть возвращена синтаксическая ошибка от oracle.
SELECT tname,NVL(count(*),0) as total
FROM table1 t1
INNER JOIN table3 t3
on t1.tname = t3.tname
inner join table2 t2
on t3.title = t2.title
where date > to_date('2012-01-01','yyyy-mm-dd')
GROUP BY tname;