Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Full Join и условие = неверный результат?


Страницы:   1 2

Раиса ©   (2008-04-07 12:24:00) 

Приведенный ниже запрос выдает не все записи. То есть не выдает записей, которых нет в x25_out_1, а есть в x25_out.
Если условие where убрать, то работает вроде бы верно. То есть если написать через временные таблицы , в которых поставить условие, а потом сравнивать, то всё нормально.

select a.id_ves,a.tm,a.da_ti,a.ad,
b.id_ves as idves2,b.tm as tm2, b.da_ti as da_ti2
from x25_out_1 a
full join x25_out b on a.id_ves=b.id_ves and a.ad=b.ad and a.tm=b.tm  
and a.da_ti=b.da_ti
and b.curdatetime>='20080402 00:00:00'
where a.curdatetime>='20080402 0:00:00'
order by a.id_ves,a.da_ti


В чем проблема?


evvcom   (2008-04-11 11:30:00) [1]


> Можно считать, что решение найдено:  where isnull(a.curdatetime,
>  b.curdatetime) >='20080410 0:00:00'

Такое решение не удовлетворяет цели:
> Раиса   (07.04.08 14:02) [6]
> Цель: найти разницу между выборками из двух таблиц с одинаквой структурой.

[25] кроме разницы с такой-то даты возвратит также и схожести :) (совпадения)


Раиса   (2008-04-11 10:44:00) [2]


> Кщд   (11.04.08 09:35) [23]

Скорее всего, результат верный.


>
> evvcom ©   (11.04.08 09:37) [24]
> Кщд   (08.04.08 09:12) [17]

игнорирован за непониманием - почти так, просто не проверен.

Можно считать, что решение найдено:  where isnull(a.curdatetime, b.curdatetime) >='20080410 0:00:00'

Спасибо!


evvcom   (2008-04-11 09:37:00) [3]

Так и не понял, чем
> Кщд   (08.04.08 09:12) [17]
не угодил? Или просто игнорирован за непониманием?


Кщд   (2008-04-11 09:35:00) [4]

select a.id_ves,a.tm,a.da_ti,a.ad,
b.id_ves as idves2,b.tm as tm2, b.da_ti as da_ti2
from x25_out_1 a
full join x25_out b on a.id_ves=b.id_ves and a.ad=b.ad and a.tm=b.tm  
and a.da_ti=b.da_ti
where isnull(a.curdatetime, b.curdatetime) >='20080410 0:00:00'
order by a.id_ves,a.da_ti


Раиса   (2008-04-11 08:57:00) [5]


> Раиса   (07.04.08 12:24)  
> То есть если написать через временные таблицы , в которых
> поставить условие, а потом сравнивать, то всё нормально.
>
>
> Раиса   (07.04.08 12:52) [4]
> а как надо написать-то? Типа конструкция : select from select
> ?


Проблема решена до того, как написан вопрос, но хотелось бы просто через full join, но увы... Немного сомневалась и решила посоветоваться со знающими людьми.


ЮЮ   (2008-04-11 03:38:00) [6]

И прямь, оказывается :(
При LEFT и INNER JOIN-ах, которыми обычно и пользуюсь, все работает более предсказуемо.

Тогда сначала подзапросами отбери по дате, а потом соединяй

select
 a.id_ves,a.tm,a.da_ti,a.ad,
 b.id_ves as idves2,b.tm as tm2, b.da_ti as da_ti2
from
  (select * dron x25_out_1 where curdatetime>='20080410')a
 full join (select * from x25_out where curdatetime>='20080410')b on
   (a.id_ves=b.id_ves) and (a.ad=b.ad) and (a.tm=b.tm) and (a.da_ti=b.da_ti)
order by a.id_ves,a.da_ti


Раиса   (2008-04-10 12:03:00) [7]

select a.id_ves,a.tm,a.da_ti,a.ad,
b.id_ves as idves2,b.tm as tm2, b.da_ti as da_ti2
from x25_out_1 a
full join x25_out b on a.id_ves=b.id_ves and a.ad=b.ad and a.tm=b.tm  
and a.da_ti=b.da_ti and b.curdatetime>='20080410 00:00:00' and a.curdatetime>='20080410 0:00:00'
order by a.id_ves,a.da_ti

И вот запрос!


ЮЮ   (2008-04-10 04:01:00) [8]

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

Не верю! запрос в студию.


Кщд   (2008-04-08 09:13:00) [9]

>Анна   (07.04.08 16:57) [14]
>В MSSQL минуса нет. Но он не "отстой".
не "отстой", но по многим параметрам проигрывает Oracle
хотя, 2008-ой пока не видел


Кщд   (2008-04-08 09:12:00) [10]

>Раиса   (07.04.08 14:47) [10]
все значащие поля включить в условие ON внешнего объединения
where a.recid is null or b.recid is null
даст несовпадения


Раиса   (2008-04-08 09:07:00) [11]

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


ЮЮ   (2008-04-08 03:23:00) [12]

А почему бы условие a.curdatetime>='20080402 0:00:00' не поместить в JOIN, как и b.curdatetime>='20080402 00:00:00'?
Плчему оно в WHERE?


Анна   (2008-04-07 16:57:00) [13]


> Таки попробуй minus

В MSSQL минуса нет. Но он не "отстой".


ANB   (2008-04-07 16:13:00) [14]


> И записей, конечно, больше миллиона. А полей немеряно...
> .

Хреново и то и то. Таки попробуй minus. Тоже не шустро, но это хоть серверу головная боль. Может таки съест. Если не съест - то мс скл - отстой.


Раиса   (2008-04-07 15:56:00) [15]

Вроде minus не встречался. И записей, конечно, больше миллиона. А полей немеряно....


ANB   (2008-04-07 15:39:00) [16]

minus мс скл жрет ?
Если не жрет и записей в обоих таблицах меньше миллиона, то not exists оптимальное решение.


Раиса   (2008-04-07 14:47:00) [17]

CREATE TABLE [X25_Out] (
[RecID] [int] IDENTITY (1, 1) NOT FOR REPLICATION  NOT NULL ,
[id_Quest] [tinyint] NOT NULL ,
[ProcessMode] [smallint] NULL CONSTRAINT [DF__X25_Out__Process__3317FD8E] DEFAULT (100),
[CurDateTime] [datetime] NOT NULL CONSTRAINT [DF__X25_Out__CurrDat__340C21C7] DEFAULT (getutcdate()),
[id_Ves] [int] NOT NULL ,
[AnswerTime] [datetime] NULL ,
[RN] [decimal](6, 0) NULL ,
[RS] [varchar] (50) COLLATE Cyrillic_General_CI_AS NULL ,
[RE] [decimal](3, 0) NULL ,
[AD] [char] (3) COLLATE Cyrillic_General_CI_AS NOT NULL ,
[FR] [char] (3) COLLATE Cyrillic_General_CI_AS NULL ,
[TM] [char] (3) COLLATE Cyrillic_General_CI_AS NULL ,
[RD_RT] [datetime] NULL ,
[DA_TI] [datetime] NULL ,
------- остальные принципиального значения не имеют.


Кщд   (2008-04-07 14:40:00) [18]

>Раиса   (07.04.08 14:27) [8]
структуру таблица, пожалуйста


Раиса   (2008-04-07 14:27:00) [19]

Нет,  id_ves - это не ПК.
Ключ там будет составной, как минимум из 4=х полей.


Кщд   (2008-04-07 14:22:00) [20]

если id_ves - это ПК, то с помощью
where a.id_ves is null or b.id_ves is null
получим записи из таблицы №1, которых нет в таблице №2 (по условию в секции ON), и наоборот


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо