Консультация № 203267
13.10.2022, 09:23
0.00 руб.
0 3 0
Уважаемые эксперты! Пожалуйста, ответьте на вопрос:

Есть две таблицы в Postgre, calls.success и calls.cancelled
Нужно вывести все данные из обоих таблиц, но во второй таблице нет половины столбцов.
Получилось это сделать через UNION подставив в недостающие параметры свои значения.
Но работает только если из первой таблицы взять все стоблцы т.е. *, а в UNION перечислить каждый столбец.
Когда пытаюсь вывести только нужные значения, всегда получаю ошибку "each UNION query must have the same number of columns"
Что еще ожидается в UNION?

Это рабочий запрос:
[code lang=sql] from ( select * from ( select s.*, 'success' as call_type from calls.success as s
union
select
NULL as id, c.inviteid,c.invitedt,NULL as acallid,NULL as bcallid,
c.fromnumber as anumber,c.fromusername as ausername,c.fromdomain as adomain,
NULL as adisplayname,c.networkaddr as anetworkaddr,c.callednum as acallednum,
NULL as arepresentative,boolin(textout(c.fromouter)) as aouter,
c.fromprovidercode as aprovidercode,NULL as bnumber,NULL as busername,
NULL as bdomain,NULL as bdisplayname,NULL as bnetworkaddr,false as bouter,
NULL as bprovidercode,c.dial_dt,NULL as start_dt,c.stop_dt,NULL as dial_duration,
0 as duration,c.stopreason,NULL as callrecpath,NULL as callstoragecode,NULL as callrecsize,
NULL as callrecdel_dt,false as isrec,NULL as recordruleid,NULL as storageruleid,
NULL as recdomain,NULL as recexpirets,NULL as sys_recdelts,NULL as dlgbinding,
NULL as esgdlg,false as isreplacing,'failed' as call_type
from calls.cancelled as c
) t
where t.invitedt between '2022-10-10T00:00:00' and '2023-09-12T23:59:59' and date_part('hours',t.invitedt) between -3 and 20 order by t.invitedt desc LIMIT 1000) as r;"[/code]



Пытаюсь вывести только нужные мне значения
[code lang=sql]" from ( select inviteid, acallednum, start_dt, stop_dt, dial_duration, duration, stopreason, call_type
from (
select s.*, 'success' as call_type from calls.success as s
union
select
c.inviteid,
c.callednum as acallednum,
NULL as start_dt,
c.stop_dt,
NULL as dial_duration,
0 as duration,
c.stopreason,
'failed' as call_type
from calls.cancelled as c
) t
where t.invitedt between '2022-10-07T00:00:00' and '2023-09-12T23:59:59' and date_part('hours',t.invitedt) between -3 and 20 order by t.invitedt desc LIMIT 1000) as r;"[/code]

Обсуждение

давно
Советник
400484
472
14.10.2022, 21:52
общий
Почитайте внимательно.
На сколько я понял, вы пытаетесь выбрать из объединенной таблицы (созданной из 2 таблиц) определенные поля, но кто сказал, что они так будут называться.
Почитайте про неявное соединение таблиц. Должно помочь.
давно
Посетитель
404693
2
14.10.2022, 22:01
общий
Получается, что в первой таблице есть все значения, а во второй таблице чего не хватает, я принудительно присваиваю.
И как мне казалось должно работать, ведь если я беру все строки из первой таблице, а во второй таблице указыаю тоже все строки и где нет нужных задаю их руками, то работает.
Меня это и смущает, что если описать все значения, то все отрабатывает.
давно
Советник
400484
472
15.10.2022, 10:13
общий
В первом запросе вы берете все столбцы - from ( select * from..., а во втором запросе from ( select inviteid, acallednum, start_dt, stop_dt, dial_duration, duration, stopreason, call_type from... пытаетесь вытащить конкретные, но вы не правильно из называете. Посмотрите тут.
Форма ответа