Prtoy 3 / 3 / 3 Регистрация: 01.06.2016 Сообщений: 299 |
||||||||||||||||
1 |
||||||||||||||||
Объединение запросов07.03.2017, 11:38. Показов 16858. Ответов 14 Метки нет (Все метки)
Здравствуйте.
Возвращает наименования офисов организации, например:
Возвращает количество людей на приёме каждом из этих офисов, например:
Возвращает количество людей в эл. очереди в каждом из офисов, аналогично предыдущему примеру
Возвращает количество принятых людей по каждому из офисов за выбранную дату Подскажите пожалуйста, как всё это объединить в один запрос, чтобы в итоге получилась одна таблица с названиями офисов и показателями по ним из примеров выше? Пробовал использовать UNION ALL, но выдало ошибку.
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
07.03.2017, 11:38 |
Ответы с готовыми решениями: Объединение 2 запросов или 1 запрос Объединение запросов имеется запрос: Объединение запросов объединение запросов if($row=mysql_fetch_array(mysql_query("SELECT word… 14 |
1213 / 938 / 373 Регистрация: 02.09.2012 Сообщений: 2,862 |
|
07.03.2017, 14:53 |
2 |
Чтобы связать все эти запросы в одно целое, нужно понимать как между собой связаны все упомянутые таблицы. Нужна модель данных. Того, что написано в разрозненных запросах, недостаточно.
0 |
3 / 3 / 3 Регистрация: 01.06.2016 Сообщений: 299 |
|
13.03.2017, 13:57 [ТС] |
3 |
grgdvo, из PostgreSQL это можно как-то извлечь?
0 |
1213 / 938 / 373 Регистрация: 02.09.2012 Сообщений: 2,862 |
|
13.03.2017, 15:12 |
4 |
Да, ищите/ставьте любой понравившийся «Data Modeler» с функцией «Reverse Engineering». Начать поиск можно отсюда.
0 |
3 / 3 / 3 Регистрация: 01.06.2016 Сообщений: 299 |
|
13.03.2017, 15:40 [ТС] |
5 |
grgdvo, вот, надеюсь, это то, что нужно.
0 |
grgdvo 1213 / 938 / 373 Регистрация: 02.09.2012 Сообщений: 2,862 |
||||
14.03.2017, 15:44 |
6 |
|||
Ну не очень диаграмма. Начните вот с этой версии запроса.
0 |
Prtoy 3 / 3 / 3 Регистрация: 01.06.2016 Сообщений: 299 |
||||||||||||
14.03.2017, 17:30 [ТС] |
7 |
|||||||||||
grgdvo, Добавлено через 15 минут
вместо
Но после этого вылезла другая ошибка: Добавил в GROUP BY столбец sp_que.ids (GROUP BY sp_struc.naz, sp_que.ids) — после этого запрос сработал, но выдал какие-то нереальные данные, плюс одинаковые во всех столбцах. Плюс, исчез один из офисов. Если поменять местами столбцы (GROUP BY sp_que.ids, sp_struc.naz) — то выходят все офисы, но данные также нереальные и одинаковые. Добавлено через 17 минут
Но вылазит вот такая ошибка:
0 |
grgdvo 1213 / 938 / 373 Регистрация: 02.09.2012 Сообщений: 2,862 |
||||
15.03.2017, 05:11 |
8 |
|||
JOIN конструкция должна быть «цельной». В подвыражении ON вы не можете использовать другие таблицы кроме тех, которые перечислены слева и справа от JOIN. Запятая не в счет, это уже другой вид соединения других таблиц. Вся проблема в соединениях связана с тем, что модель связей таблиц четко не прописана. У вас в принципе queue.onpriem висячая таблица, непонятно как она с кем связана. Также по смыслу непонятно, что таблицы обозначают и какая смысловая связь между ними. Если главная сущность sp_struc — офис (больница), в больнице существует одна (может больше) электронная очередь — queue.sp_que, в настоящий момент на приеме есть пациенты из такой-то очереди (может быть нескольких очередей) — queue.onpriem, то вероятно можно запрос так построить
Еще раз повторю, связи на диаграмме плохие. Следует обозначать и понимать, по каким полям связаны таблицы. С одной стороны чаще всего в связи участвует первичный ключ, с другой внешний ключ. На связях эти ограничения должны быть указаны: так будет понятно.
1 |
3 / 3 / 3 Регистрация: 01.06.2016 Сообщений: 299 |
|
15.03.2017, 08:14 [ТС] |
9 |
grgdvo, Так тоже не получилось, ОШИБКА: столбец «sp_que.ids» должен фигурировать в предложении GROUP BY или использоваться в агрегатной функции. Да, не имея самой базы под рукой, сложно понять… Попробую словами объяснить. Можно конечно сделать модель всей базы данных, там очень много всяких таблиц и зависимостей, но теоретически этих двух должно хватать.
0 |
1213 / 938 / 373 Регистрация: 02.09.2012 Сообщений: 2,862 |
|
15.03.2017, 10:13 |
10 |
вот как раз для onpriem, que и stat и не хватает описания связующих полей. какие поля в этих таблицах отвечают за связь с электронной очередью??? а с ОШИБКОЙ это я сглупил, копипастил запрос с предыдущего поста и не исправил. Конечно должна быть сортировка по sp_struc.naz, т.е. ORDER BY sp_struc.naz
1 |
Prtoy 3 / 3 / 3 Регистрация: 01.06.2016 Сообщений: 299 |
||||
15.03.2017, 11:19 [ТС] |
11 |
|||
grgdvo, да, так получилось. Это мы узнали сколько где на приёме людей. Таким же образом остальные запросы можно присобачить? sp_que.id = onpriem.idq = que.idq = stat.idq — это все номера электронных очередей, они и связаны между собой. Добавлено через 54 минуты
Запрос срабатыает, но снова показывает какую-то чушь…
0 |
grgdvo 1213 / 938 / 373 Регистрация: 02.09.2012 Сообщений: 2,862 |
||||
15.03.2017, 15:52 |
12 |
|||
Сообщение было отмечено Prtoy как решение Решение
Не самый оптимальный план запроса будет при такой форме, но что-то я сходу не соображу, как можно совместить COUNT и SUM.
1 |
Prtoy 3 / 3 / 3 Регистрация: 01.06.2016 Сообщений: 299 |
||||
15.03.2017, 16:03 [ТС] |
13 |
|||
grgdvo, спасибо большое. Только чуть-чуть подправил, в 12 строке WHERE sp_que.id = stat.idq и надо было за выбранную дату, с определённым параметром (rez = 1), т.е. 12 строка получилась:
А что делает SUM и чем от COUNT отличается? Раньше не сталкивался…
0 |
1213 / 938 / 373 Регистрация: 02.09.2012 Сообщений: 2,862 |
|
15.03.2017, 16:14 |
14 |
COUNT(*) вы просто считаете записи, которые выбрали из таблицы
0 |
3 / 3 / 3 Регистрация: 01.06.2016 Сообщений: 299 |
|
15.03.2017, 16:31 [ТС] |
15 |
Спасибо. Срабатывает быстро, таблицы с очередями вряд ли вырастут настолько, чтобы нужно было данный запрос оптимизировать… Сам вряд ли справлюсь, нужно более углублённо изучать SQL, и скорее всего, начинать с нуля Спасибо ещё раз за помощь.
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
15.03.2017, 16:31 |
15 |
Причина очень проста. Формально comma-style join — это алиас CROSS JOIN. Но есть подвох — приоритет comma-style join ниже приоритета explicit join. И выражение источника данных, если расставить скобки в соответствии с приоритетом, получится такое:
from
table1 , ( table2
left join table1 h on table1.id = h.id
left join table2 s on table2.id = s.id )
Вот теперь прекрасно видно, что внутри скобки о существовании где-то там снаружи table1 ничего не известно.
Правильно — забыть НАВСЕГДА о возможности использовать запятую. И писать вот так:
FROM table1
CROSS JOIN table2
LEFT JOIN table1 h ON table1.id = h.id
LEFT JOIN table2 s ON table2.id = s.id
PS. Если всё же без comma-style жизнь не мила, можно поступить так, как обычно делают для явного задания приоритета. То есть добавить задающие приоритет скобки:
FROM (table1 , table2)
LEFT JOIN table1 h ON table1.id = h.id
LEFT JOIN table2 s ON table2.id = s.id
Теперь всё в порядке — сначала выполнится запятая, а потом к результату будут LEFT JOIN остальные две таблицы.
Запрос который работает
select analytics.public.client.name, analytics.public.client.whatsapp, analytics.public.incoming_request.utm_source
from client
inner join incoming_request
on client.id = incoming_request.client_id;
Добавил AS и этот же запрос перестал работать
select analytics.public.client.name, analytics.public.client.whatsapp, analytics.public.incoming_request.utm_source
from client as c
inner join incoming_request as ir
on c.id = ir.client_id
Ну вот как так???
Код ошибки
[42P01] ОШИБКА: в элементе предложения FROM неверная ссылка на таблицу "client" Подсказка: Возможно, предполагалась ссылка на псевдоним таблицы "c". Позиция: 8
Но там нет, я перепроверил
задан 16 авг 2021 в 19:08
Для этого случая даже специальную отдельную подсказку выводим
* If we found a match that has an alias and the alias is visible in the
* namespace, then the problem is probably use of the relation's real name
* instead of its alias, ie "SELECT foo.* FROM foo f". This mistake is
* common enough to justify a specific hint.
Запрос вида
SELECT foo.column_name FROM foo as f
Ошибочен. Если вы пишете алиас — то и далее в запросе должны использовать этот алиас, т.е.
SELECT f.column_name FROM foo as f
Поскольку отношения foo
более в дереве запроса нет, вы указали ему псевдоним.
PS: указывать имена полей, начиная с имени базы — довольно странная затея. Тогда уж и имена таблиц пишите так же, и все операторы тоже fully qualified, а то как-то непоследовательно.
ответ дан 16 авг 2021 в 19:34
МелкийМелкий
21.3k3 золотых знака27 серебряных знаков53 бронзовых знака
2
I have the following SQL (PostgreSQL) query:
SELECT ff.*, fp.*
FROM fibra ff, fibra fp
JOIN cables cp ON fp.cable_id = cp.id
LEFT OUTER JOIN terceiro ced_pai ON ced_pai.id = cp.cedente_id
LEFT OUTER JOIN terceiro tp ON tp.id = fp.terceiro_id
JOIN cables cf ON ff.cable_id = cf.id
LEFT OUTER JOIN terceiro ced_f ON ced_f.id = cf.cedente_id
LEFT OUTER JOIN terceiro tf ON tf.id = ff.terceiro_id
where ff.fibra_pai_id = fp.id
AND ff.cable_id IN (8,9,10)
AND fp.cable_id IN (8,9,10)
But it’s giving me this error:
ERROR: invalid reference to FROM-clause entry for table "ff"
LINE 8: JOIN cables cf ON ff.cable_id = cf.id
^
HINT: There is an entry for table "ff", but it cannot be referenced from this part of the query.
********** Error **********
ERROR: invalid reference to FROM-clause entry for table "ff"
SQL state: 42P01
Hint: There is an entry for table "ff", but it cannot be referenced from this part of the query.
Character: 261
Does anyone know what AM I doing wrong ?
asked Nov 8, 2012 at 20:43
3
You are mixing implicit and explicit JOINs. That’s generally confusing to read, and leads to unexpected order-of-evaluation problems, as you’ve just discovered.
You should consistently use JOIN ... ON
syntax everywhere; avoid the legacy FROM table1, table2
. If you correct your query to use an explicit JOIN instead of FROM fibra ff, fibra fp
, eg FROM fibra ff INNER JOIN fibra fp ON (ff.fibra_pai_id = fp.id)
and omit ff.fibra_pai_id = fp.id
from the WHERE
clause, you should get the expected result.
See this question that A.H. linked to:
Mixing explicit and implicit joins fails with «There is an entry for table … but it cannot be referenced from this part of the query»
answered Nov 9, 2012 at 0:53
Craig RingerCraig Ringer
304k74 gold badges680 silver badges765 bronze badges
3
Convert all the joins in your query to be explicit to avoid the issue you’re having—don’t leave some implicit and others explicit.
This should work:
SELECT ff.*, fp.*
FROM fibra ff
JOIN fibra fp ON ff.fibra_pai_id = fp.id
JOIN cables cp ON fp.cable_id = cp.id
LEFT OUTER JOIN terceiro ced_pai ON ced_pai.id = cp.cedente_id
LEFT OUTER JOIN terceiro tp ON tp.id = fp.terceiro_id
JOIN cables cf ON ff.cable_id = cf.id
LEFT OUTER JOIN terceiro ced_f ON ced_f.id = cf.cedente_id
LEFT OUTER JOIN terceiro tf ON tf.id = ff.terceiro_id
WHERE
ff.cable_id IN (8,9,10)
AND fp.cable_id IN (8,9,10)
answered Nov 8, 2012 at 20:49
RayRay
40.1k20 gold badges97 silver badges137 bronze badges
1
In my case the problem was that I forgot I had assigned my tables to a particular schema and needed to reference those e.g:
select r.*
from my_schema.resources r
answered Aug 25, 2021 at 16:08
JonathanJonathan
10.9k8 gold badges63 silver badges79 bronze badges
Database Exception – yiidbException
SQLSTATE[42P01]: Undefined table: 7 ERROR: invalid reference to FROM-clause entry for table "ct"
LINE 8: inner join generate_subscripts(ct.conkey, 1) as s on 1=1
^
HINT: There is an entry for table "ct", but it cannot be referenced from this part of the query.
The SQL being executed was: select
a.attname as column_name,
fc.relname as foreign_table_name,
fns.nspname as foreign_table_schema,
fa.attname as foreign_column_name
from
pg_constraint ct
inner join generate_subscripts(ct.conkey, 1) as s on 1=1
inner join pg_class c on c.oid=ct.conrelid
inner join pg_namespace ns on c.relnamespace=ns.oid
inner join pg_attribute a on a.attrelid=ct.conrelid and a.attnum = ct.conkey[s]
left join pg_class fc on fc.oid=ct.confrelid
left join pg_namespace fns on fc.relnamespace=fns.oid
left join pg_attribute fa on fa.attrelid=ct.confrelid and fa.attnum = ct.confkey[s]
where
ct.contype='f'
and c.relname='acc_periode'
and ns.nspname='public'
order by
fns.nspname, fc.relname, a.attnum
Error Info: Array
(
[0] => 42P01
[1] => 7
[2] => ERROR: invalid reference to FROM-clause entry for table "ct"
LINE 8: inner join generate_subscripts(ct.conkey, 1) as s on 1=1
^
HINT: There is an entry for table "ct", but it cannot be referenced from this part of the query.
)
↵
Caused by: PDOException
SQLSTATE[42P01]: Undefined table: 7 ERROR: invalid reference to FROM-clause entry for table "ct"
LINE 8: inner join generate_subscripts(ct.conkey, 1) as s on 1=1
^
HINT: There is an entry for table "ct", but it cannot be referenced from this part of the query.
in /home/mdmunir/NetBeansProjects/deesoft/development/vendor/yiisoft/yii2/db/Command.php at line 820
I am using postgresql.
Error provide when call $db->getSchema()->getTableSchemas($schemaName)