Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Рочему в Oracle Sql не работает объединение с функциями  [new]
Гость123
Guest
Пытаясь сделать объединение двух таблиц в запросе по полям, которые обрабатываются функцией происходит ошибка, например:

SELECT
    t1.field1,
    t2.field2
FROM
    t1,
    t2
WHERE
    TO_CHAR(t1.data,'dd.mm.yyyy') = TO_CHAR(t2.data,'dd.mm.yyyy')

Подскажите, почему нельзя делать такие объединения и как решить такую ситуация?
25 авг 07, 20:19    [4575727]     Ответить | Цитировать Сообщить модератору
 Re: Рочему в Oracle Sql не работает объединение с функциями  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116169
Гость123
Пытаясь сделать объединение двух таблиц в запросе по полям, которые обрабатываются функцией происходит ошибка, например:

SELECT
    t1.field1,
    t2.field2
FROM
    t1,
    t2
WHERE
    TO_CHAR(t1.data,'dd.mm.yyyy') = TO_CHAR(t2.data,'dd.mm.yyyy')

Подскажите, почему нельзя делать такие объединения и как решить такую ситуация?


А что за ошибка, не поделитесь ?
25 авг 07, 20:22    [4575729]     Ответить | Цитировать Сообщить модератору
 Re: Рочему в Oracle Sql не работает объединение с функциями  [new]
Гость123
Guest
Точно не помню, но что-то типа проблемы с синтаксисом. Точное описание ошибки смогу посмотреть и сказать только в будни.
25 авг 07, 20:29    [4575735]     Ответить | Цитировать Сообщить модератору
 Re: Рочему в Oracle Sql не работает объединение с функциями  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116169
Гость123
Точно не помню, но что-то типа проблемы с синтаксисом. Точное описание ошибки смогу посмотреть и сказать только в будни.


Ага, посмотрите ...

drop table t1
/
drop table t2
/
create table t1 (field1 varchar2(30), data date)
/
create table t2 (field2 varchar2(30), data date)
/
insert into t1 values (1,sysdate)
/
insert into t2 values (2,sysdate)
/
SELECT
    t1.field1,
    t2.field2
FROM
    t1,
    t2
WHERE
    TO_CHAR(t1.data,'dd.mm.yyyy') = TO_CHAR(t2.data,'dd.mm.yyyy')
/
FIELD1 FIELD2 
1 2 
25 авг 07, 20:32    [4575741]     Ответить | Цитировать Сообщить модератору
 Re: Рочему в Oracle Sql не работает объединение с функциями  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 6912
Гость123
Точно не помню, но что-то типа проблемы с синтаксисом.

Ну если проблемы с синтаксисом, то Вы неправильно написали запрос всего навсего :)
25 авг 07, 21:30    [4575791]     Ответить | Цитировать Сообщить модератору
 Re: Рочему в Oracle Sql не работает объединение с функциями  [new]
Гость123
Guest
Да, немного запамятовал, Inner Join работает, а вот с Left Join проблемы.

    TO_CHAR(t1.data,'dd.mm.yyyy') = TO_CHAR(t2.data,'dd.mm.yyyy') (+)
26 авг 07, 14:55    [4576274]     Ответить | Цитировать Сообщить модератору
 Re: Рочему в Oracle Sql не работает объединение с функциями  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 6912
Гость123
Да, немного запамятовал, Inner Join работает, а вот с Left Join проблемы.

    TO_CHAR(t1.data,'dd.mm.yyyy') = TO_CHAR(t2.data,'dd.mm.yyyy') (+)

TO_CHAR здесь не нужен, без него будет намного лучше
26 авг 07, 15:00    [4576281]     Ответить | Цитировать Сообщить модератору
 Re: Рочему в Oracle Sql не работает объединение с функциями  [new]
anvano
Member

Откуда: Москва
Сообщений: 986
Гость123
Да, немного запамятовал, Inner Join работает, а вот с Left Join проблемы.

    TO_CHAR(t1.data,'dd.mm.yyyy') = TO_CHAR(t2.data,'dd.mm.yyyy') (+)



Плюс не там.

    TO_CHAR(t1.data,'dd.mm.yyyy') = TO_CHAR(t2.data(+),'dd.mm.yyyy') 
26 авг 07, 15:01    [4576282]     Ответить | Цитировать Сообщить модератору
 Re: Рочему в Oracle Sql не работает объединение с функциями  [new]
Гость123
Guest
Вот оно что! Спасибо всем за подсказки.
26 авг 07, 15:04    [4576286]     Ответить | Цитировать Сообщить модератору
 Re: Рочему в Oracle Sql не работает объединение с функциями  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 6912
anvano
Гость123
Да, немного запамятовал, Inner Join работает, а вот с Left Join проблемы.
    TO_CHAR(t1.data,'dd.mm.yyyy') = TO_CHAR(t2.data,'dd.mm.yyyy') (+)

Плюс не там.
    TO_CHAR(t1.data,'dd.mm.yyyy') = TO_CHAR(t2.data(+),'dd.mm.yyyy') 

молодец, "подсказал"
26 авг 07, 15:06    [4576290]     Ответить | Цитировать Сообщить модератору
 Re: Рочему в Oracle Sql не работает объединение с функциями  [new]
Гость123
Guest
alex-ls, неужели не правильно?
26 авг 07, 15:11    [4576296]     Ответить | Цитировать Сообщить модератору
 Re: Рочему в Oracle Sql не работает объединение с функциями  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116169
Гость123
alex-ls, неужели не правильно?


Присоединяюсь к вопросу

drop table t1
/
drop table t2
/
create table t1 (field1 varchar2(30), data date)
/
create table t2 (field2 varchar2(30), data date)
/
insert into t1 values (1,sysdate)
/
insert into t1 values (3,sysdate+(1/24))
/
insert into t2 values (1,sysdate)
/
SELECT
    t1.field1,
    t2.field2
FROM
    t1,
    t2
WHERE
   TO_CHAR(t1.data,'dd.mm.yyyy') = TO_CHAR(t2.data (+) ,'dd.mm.yyyy')
/
FIELD1 FIELD2 
3 1 
1 1 

alex-ls, а Ваш совет приводит к неэквивалентному результату

SELECT
    t1.field1,
    t2.field2
FROM
    t1,
    t2
WHERE
   t1.data = t2.data (+) 
/
FIELD1 FIELD2 
3 -  
1 -  
26 авг 07, 15:21    [4576306]     Ответить | Цитировать Сообщить модератору
 Re: Рочему в Oracle Sql не работает объединение с функциями  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 6912
Гость123
alex-ls, неужели не правильно?

повторяю в данном случае функция TO_CHAR не нужна, она здесь толко вред приносит
26 авг 07, 15:21    [4576309]     Ответить | Цитировать Сообщить модератору
 Re: Рочему в Oracle Sql не работает объединение с функциями  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 6912
dmidek
Гость123
alex-ls, неужели не правильно?


Присоединяюсь к вопросу

[src oracle]drop table t1
/
drop table t2
/
create table t1 (field1 varchar2(30), data date)
/
create table t2 (field2 varchar2(30), data date)
/
insert into t1 values (1,sysdate)
/
insert into t1 values (3,sysdate+(1/24))
/
insert into t2 values (1,sysdate)
/

dmidek что это Вы вставляете в поле типа VARCHAR2? Если это не данные типа даты, то на кой их к дате приводить функцией TO_CHAR???
26 авг 07, 15:25    [4576312]     Ответить | Цитировать Сообщить модератору
 Re: Рочему в Oracle Sql не работает объединение с функциями  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116169
alex-ls
dmidek
Гость123
alex-ls, неужели не правильно?


Присоединяюсь к вопросу

[src oracle]drop table t1
/
drop table t2
/
create table t1 (field1 varchar2(30), data date)
/
create table t2 (field2 varchar2(30), data date)
/
insert into t1 values (1,sysdate)
/
insert into t1 values (3,sysdate+(1/24))
/
insert into t2 values (1,sysdate)
/

dmidek что это Вы вставляете в поле типа VARCHAR2? Если это не данные типа даты, то на кой их к дате приводить функцией TO_CHAR???


Простите, Вы не перепутали поля field1(2) и data ?
26 авг 07, 15:26    [4576314]     Ответить | Цитировать Сообщить модератору
 Re: Рочему в Oracle Sql не работает объединение с функциями  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 6912
тьфу все понял... блин, ну TRUNC если надо время обрезать....
26 авг 07, 15:26    [4576315]     Ответить | Цитировать Сообщить модератору
 Re: Рочему в Oracle Sql не работает объединение с функциями  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 6912
Если такая мысль и была у автора, то эту мысль надо было показать явно TRUNC. А так он вполне возможно и не ожидал результата, который Вы dmidek продемонстрировали.
Ставлю на то, что ничего обрезать автору не надо было
26 авг 07, 15:30    [4576318]     Ответить | Цитировать Сообщить модератору
 Re: Рочему в Oracle Sql не работает объединение с функциями  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116169
alex-ls
Если такая мысль и была у автора, то эту мысль надо было показать явно TRUNC. А так он вполне возможно и не ожидал результата, который Вы dmidek продемонстрировали.
Ставлю на то, что ничего обрезать автору не надо было


Может быть, но мой хрустальный шар показал по-другому
А trunc лучше, я согласен. Правда с ним был бы тот же вопрос-
а куда ставить плюс ?

trunc(t1.data) = trunc(t2.data (+)) 
vs неверный
trunc(t1.data) = trunc(t2.data) (+)
26 авг 07, 15:36    [4576324]     Ответить | Цитировать Сообщить модератору
 Re: Рочему в Oracle Sql не работает объединение с функциями  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 6912
dmidek
alex-ls
Если такая мысль и была у автора, то эту мысль надо было показать явно TRUNC. А так он вполне возможно и не ожидал результата, который Вы dmidek продемонстрировали.
Ставлю на то, что ничего обрезать автору не надо было


Может быть, но мой хрустальный шар показал по-другому

надеюсь автор ответит нам?

dmidek

Правда с ним был бы тот же вопрос-
а куда ставить плюс ?

trunc(t1.data) = trunc(t2.data (+)) 
vs неверный
trunc(t1.data) = trunc(t2.data) (+)

а вот к этой конкретной подсказке у меня вопросов нет.
26 авг 07, 15:38    [4576329]     Ответить | Цитировать Сообщить модератору
 Re: Рочему в Oracle Sql не работает объединение с функциями  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116169
Кстати, забавная корреляция с соседним топиком.
Пожалуй в таких случаях ANSI-синтаксис выглядит понагляднее

SELECT
    t1.field1,
    t2.field2
FROM
    t1 LEFT JOIN t2
ON
    TO_CHAR(t1.data,'dd.mm.yyyy') = TO_CHAR(t2.data ,'dd.mm.yyyy')
/
FIELD1 FIELD2 
3 1 
1 1 
26 авг 07, 15:46    [4576336]     Ответить | Цитировать Сообщить модератору
 Re: Рочему в Oracle Sql не работает объединение с функциями  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 6912
dmidek
Кстати, забавная корреляция с соседним топиком.
Пожалуй в таких случаях ANSI-синтаксис выглядит понагляднее

А я в некоторых случаях им и пользуюсь... OR, IN например быстрее через ANSI мне сделать...
26 авг 07, 16:12    [4576364]     Ответить | Цитировать Сообщить модератору
 Re: Рочему в Oracle Sql не работает объединение с функциями  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 63958
Блог
dmidek
Пожалуй в таких случаях ANSI-синтаксис выглядит понагляднее

ANSI-синтаксис выглядит понагляднее только в очень простых случаях, в том числе в данном. При четырех-пяти исходных таблицах и при наличии where-части записать запрос так, чтобы его было удобно читать, становится большой проблемой (я когда-то даже специальный топик создавал на эту тему - и хорошего решения так и не увидел).
27 авг 07, 09:38    [4577336]     Ответить | Цитировать Сообщить модератору
 Re: Рочему в Oracle Sql не работает объединение с функциями  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116169
softwarer
dmidek
Пожалуй в таких случаях ANSI-синтаксис выглядит понагляднее

ANSI-синтаксис выглядит понагляднее только в очень простых случаях, в том числе в данном. При четырех-пяти исходных таблицах и при наличии where-части записать запрос так, чтобы его было удобно читать, становится большой проблемой (я когда-то даже специальный топик создавал на эту тему - и хорошего решения так и не увидел).


Я согласен, действительно в этом случае ненаглядно.
Но есть и более сложные случаи объединения. Здесь ИМХО ANSI-JOIN дает фору.

Например в этой теме Внешние объединения
(Интересна вся тема в целом, и приведенный эквивалентный вариант Elic
заставляет задуматься)
27 авг 07, 12:03    [4578415]     Ответить | Цитировать Сообщить модератору
 Re: Рочему в Oracle Sql не работает объединение с функциями  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 63958
Блог
dmidek
Но есть и более сложные случаи объединения. Здесь ИМХО ANSI-JOIN дает фору.

"Здесь" имхо показан в том числе один из недостатков, мешающих нормально воспринимать ansi join в сложных случаях - разбросанность эквивалентных ограничений между on и where. В целом - я не собираюсь спорить с тем, что в каком-то количестве реальных случаев этот синтаксис будет лучше. В целом.... скажем так: я верю в нетривиальную систему с "целиком красивым кодом" на плюсиках и не верю в нетривиальную систему с "целиком красивым кодом" на ansi join-ах. Понятия красоты и нетривиальности, безусловно, сугубо личные. Вариант смешивания синтаксиса... не знаю, мне кажется лучше его сколь возможно избегать.
27 авг 07, 12:21    [4578565]     Ответить | Цитировать Сообщить модератору
 Re: Рочему в Oracle Sql не работает объединение с функциями  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116169
softwarer
dmidek
Но есть и более сложные случаи объединения. Здесь ИМХО ANSI-JOIN дает фору.

"Здесь" имхо показан в том числе один из недостатков, мешающих нормально воспринимать ansi join в сложных случаях - разбросанность эквивалентных ограничений между on и where. В целом - я не собираюсь спорить с тем, что в каком-то количестве реальных случаев этот синтаксис будет лучше. В целом.... скажем так: я верю в нетривиальную систему с "целиком красивым кодом" на плюсиках и не верю в нетривиальную систему с "целиком красивым кодом" на ansi join-ах. Понятия красоты и нетривиальности, безусловно, сугубо личные. Вариант смешивания синтаксиса... не знаю, мне кажется лучше его сколь возможно избегать.


Интересно, может ли Ваше мнение измениться при совершенствовании Oracle ANSI-
синтаксиса или оно сильно априори настроено против из- за того ужаса ,
который творился в девятке ?
Насколько я понимаю, ANSI-Join - это так сказать зеленая ветка, тогда как
(+) - уже нет. Аналогия между RBO и CBO пока еще наверное слишком натянута,
но я думаю, что со временем она будет становиться все более и более
адекватной.
27 авг 07, 12:32    [4578662]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить