Запрос. 2 связаные таблицы. Настандартное обьединение. КАК?
Запрос. 2 связаные таблицы. Настандартное обьединение. КАК?
Помогите. Попробовал join не помогает, union помогает но не совсем.
В общем имеем 2 таблицы.
таблица основная
ID NAME PHONE
1 vasya 44
2 petya 33
3 fedya 44
4 masha 44
таблица 2 содержит некоторую информацию, допустим какой человек сколько раз был судим в каком году, код правонарушения (связь между таблицами по полю ID)
ID CAUSE YEARS
1 456 1999
1 457 2001
2 456 2001
нужно создать запрос (ХП не предлагать, именно запрос)
который возвращает значения из 1 таблицы, и еще одно поле вычисляемое в котором будет 1-если есть записи по судимости, и 0-если нету.
Еще чтобы была возможность сортировки результата.
К примеру хочу найти всю инфу по людяи чей телефон 44 и еще узнать был ли он судим или нет.Отсортированый по имени.
Результат такой
ID NAME PHONE SUDIM
3 fedya 44 0
4 masha 44 0
1 vasya 44 1
В общем имеем 2 таблицы.
таблица основная
ID NAME PHONE
1 vasya 44
2 petya 33
3 fedya 44
4 masha 44
таблица 2 содержит некоторую информацию, допустим какой человек сколько раз был судим в каком году, код правонарушения (связь между таблицами по полю ID)
ID CAUSE YEARS
1 456 1999
1 457 2001
2 456 2001
нужно создать запрос (ХП не предлагать, именно запрос)
который возвращает значения из 1 таблицы, и еще одно поле вычисляемое в котором будет 1-если есть записи по судимости, и 0-если нету.
Еще чтобы была возможность сортировки результата.
К примеру хочу найти всю инфу по людяи чей телефон 44 и еще узнать был ли он судим или нет.Отсортированый по имени.
Результат такой
ID NAME PHONE SUDIM
3 fedya 44 0
4 masha 44 0
1 vasya 44 1
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
Re: Запрос. 2 связаные таблицы. Настандартное обьединение. К
Если Firebird >= 1.5 тогда можно так:
Код не проверял, но по логике должно работать.
С уважением, Иван.
Код: Выделить всё
SELECT
T1.ID, T1.NAME, T1.PHONE,
CASE
WHEN COUNT(T2.ID) > 0 THEN 1 ELSE 0
END AS SUDIM
FROM TABLE1 T1 LEFT JOIN TABLE2 T2 ON T1.ID = T2.ID
GROUP BY T1.ID, T1.NAME, T1.PHONE
ORDER BY T1.NAME
С уважением, Иван.
Вобщем это почти что надо. Влт чтл получилось.Dimitry Sibiryakov писал(а):Ну и какие проблемы? OUTER JOIN + GROUP BY + COUNT(S.ID) as SUDIM
Код: Выделить всё
SELECT t1.id, count(t2.id) as sudim
FROM table1 t1 left outer join table2 t2
on (t1.ID=t2.id)
WHERE
t1.phone LIKE "44%"
group by t1.id
/*ORDER BY t1.NAME*/
3 0
4 0
1 2
а надо типа
Код: Выделить всё
SELECT [b]t1.*[/b], count(t2.id) as sudim
FROM table1 t1 left outer join table2 t2
on (t1.ID=t2.id)
WHERE
t1.phone LIKE "44%"
group by t1.id
[b]ORDER BY t1.NAME[/b]
3 fedya 44 0
4 masha 44 0
1 vasya 44 1
то есть результат не будет содержать инфу о имени и номере телефона (и еще куча других полей типа фамилия, ...) и отсортировать не получится.
попытка добавить в список полей остальные поля проваливается так как стоит group by.
зы firebird 1.0 dialect 1
на переход на 1.5 нехватает человеко-ресурсов
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
А FB1.5 нужен только для того, что бы вернуть SUDIM = {0,1}, т.е. в моём случае воспользоваться функцией CASEKSilver писал(а):зы firebird 1.0 dialect 1
на переход на 1.5 нехватает человеко-ресурсов
Код: Выделить всё
CASE
WHEN COUNT(T2.ID) > 0 THEN 1 ELSE 0
END AS SUDIM
Код: Выделить всё
SELECT
T1.ID, T1.NAME, T1.PHONE, COUNT(T2.ID)
FROM TABLE1 T1 LEFT JOIN TABLE2 T2 ON T1.ID = T2.ID
GROUP BY T1.ID, T1.NAME, T1.PHONE
ORDER BY T1.NAME
вобщето не запрещает, , но остальных полей 80 штук (на примере я ж не привел прям весь список), и хотелось бы select со звездочкой (так как количество полей может меняться), но видно не судьба.Dimitry Sibiryakov писал(а):А сделать GROUP BY остальным полям как предлагал avenger запрещает религия?
select в тексте програмы один, только когда загоняю текст запроса в компонент то подставляю то одну таблицу (80 полей), то вторую (84), поля выбирались звездочкой, и не надо было следить за ними.
Теперь вот как я вижу надо будет еще и за полями в тексте запроса следить, в двух местах: в select и в group by.
avenger, case хорошо, но мне действительно не важно 1 или 21, главное ноль или не ноль . спасибо.
-
- Заслуженный разработчик
- Сообщения: 644
- Зарегистрирован: 15 фев 2005, 11:34