Вопрос про SQL запрос

sanek300509

Как сделать проще?
имеется
create table t1
(
DT datetime,
IV numeric(18,6)
)
create table t2
(
DT datetime,
IV numeric(18,6)
)
insert into t1 values ('2008-06-11 12:31:00', 1)
insert into t1 values ('2008-06-11 12:33:00', 3)
insert into t1 values ('2008-06-11 12:35:00', 5)
insert into t1 values ('2008-06-11 12:37:00', 7)
insert into t2 values ('2008-06-11 12:30:00', 0)
insert into t2 values ('2008-06-11 12:32:00', 2)
insert into t2 values ('2008-06-11 12:34:00', 4)
insert into t2 values ('2008-06-11 12:36:00', 6)
запрос в лоб
select b.*, t1.IV, t2.IV from
(
select DT from t1
union
select DT from t2
) b
left join t1 on t1.DT=b.DT
left join t2 on t2.DT=b.DT
резалтсет
2008-06-11 12:30:00.000 NULL 0.000000
2008-06-11 12:31:00.000 1.000000 NULL
2008-06-11 12:32:00.000 NULL 2.000000
2008-06-11 12:33:00.000 3.000000 NULL
2008-06-11 12:34:00.000 NULL 4.000000
2008-06-11 12:35:00.000 5.000000 NULL
2008-06-11 12:36:00.000 NULL 6.000000
2008-06-11 12:37:00.000 7.000000 NULL
проще как сделать?

sinet

Задачу сформулируй. Даты в разных таблицах могут совпадать?
select DT,IV,null from t1
union all
select DT,null,IV from t2

sanek300509

задача получить такой резалтсет как я указал, все данные могут быть любыми
совпадать могут

sinet

Короче, вот тебе второй вариант. Какой из них подойдет зависит от задачи.
select DT,t1.IV,t2.IV from t1
outer join t2 using(DT)

sanek300509

нет не работает
insert into t2 values ('2008-06-11 12:37:00', 17)
17 и 7 не объединяет

sinet

Опиши поведение в случае наличия совпадающих/повторяющихся дат.

sanek300509

вот вслучае совпадения дат, что должно быть
2008-06-11 12:30:00.000 NULL 0.000000
2008-06-11 12:31:00.000 1.000000 NULL
2008-06-11 12:32:00.000 NULL 2.000000
2008-06-11 12:33:00.000 3.000000 NULL
2008-06-11 12:34:00.000 NULL 4.000000
2008-06-11 12:35:00.000 5.000000 NULL
2008-06-11 12:36:00.000 NULL 6.000000
2008-06-11 12:37:00.000 7.000000 17.000000

sinet

А если в одной таблице будут две одинаковые даты?

sanek300509

2008-06-11 12:37:00.000 7.000000 17.000000

sinet

А если добавить
insert into t2 values ('2008-06-11 12:37:00', 17)
insert into t2 values ('2008-06-11 12:37:00', 19)
?

sanek300509

не один к одному в одно время одно значение в каждой таблице
двух значений быть не может

sinet

Тогда outer join подойдет.

Alexander08

вот ведь пиздец. взять простейший справочник по скулю не судьба, а ебать всем мозг - это пожалуйста

kruzer25

Юнионы - зло, если в них нет реальной необходимости (а такой практически никогда нет то за их использование надо отрывать руки.

pitrik2

Юнионы - зло, если в них нет реальной необходимости (а такой практически никогда нет то за их использование надо отрывать руки.
а где же твой вариант решения данной задачи без юнионов? ;)

Boris1980

На огромных таблицах спорно.
Объединить два мгновенно работающих запроса - хуже чем городить нетривиальные всеохватывающие условия.

kruzer25

а где же твой вариант решения данной задачи без юнионов?
А где же "данная задача"?
Я в этом треде никакой задачи не увидел, задача скрыта, а здесь автор треда пытается узнать, как именно реализовать один из вариантов решения задачи (судя по всему - неправильный).

kruzer25

Объединить два мгновенно работающих запроса - хуже чем городить нетривиальные всеохватывающие условия.
Ряды разных таблиц - разные сущности, как их можно объединять?
Единственная задача, в которой я могу предположить использование юнионов - это что-нибудь вроде страницы со списком, например, списаний и зачислений. Но и там юнионы необязательны - страница с таким общим списком может понадобиться только за какой-то определённый срок (например, со вчерашней полуночи до текущего момента и можно тупо взять отдельно нужные ряды из одной таблицы, из другой, после чео объединять их уже перед выводом пользователя, удобные фишки юниона вроде LIMIT тут нахуй не нужны.

Boris1980

Иногда интерфейсы вывода информации пользователю (grid, ekRTF, Excel) не позволяют тебе совершать операции Union или Minus и их приходится осуществлять силами сервера БД.
тупо взять отдельно нужные ряды из одной таблицы, из другой, после чео объединять их уже перед выводом пользователя

kruzer25

А что же у тебя находится между БД и экселем, магия?

6yrop

Юнионы - зло, если в них нет реальной необходимости (а такой практически никогда нет то за их использование надо отрывать руки.
Речь идет о UNION или UNION ALL?

Boris1980

Конструктор отчетов. Используя его настройки можно формировать различного рода формы вывода информации. Если к созданию каждого отчета привлекать программиста, то эту систему невозможно/сложно будет поддерживать и развивать.

kruzer25

Конструктор отчетов
ОК, убедил.
Оставить комментарий
Имя или ник:
Комментарий: