Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.10.12;
Скачать: CL | DM;

Вниз

Full Join и условие = неверный результат?   Найти похожие ветки 

 
Раиса   (2008-04-07 12:24) [0]

Приведенный ниже запрос выдает не все записи. То есть не выдает записей, которых нет в 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


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


 
Кщд   (2008-04-07 12:35) [1]

>a.curdatetime>="20080402 0:00:00"
всё верно
чему равно null >= "20080402 0:00:00"?


 
Раиса   (2008-04-07 12:47) [2]

Понятно, но неожиданно.

А так прокатит или пробовать надо?
where a.curdatetime>="20080402 0:00:00" or b.curdatetime>="20080402 0:00:00"


 
Кщд   (2008-04-07 12:49) [3]

>b.curdatetime>="20080402 0:00:00"
это равносильно 1=1


 
Раиса   (2008-04-07 12:52) [4]

а как надо написать-то? Типа конструкция : select from select ?


 
Кщд   (2008-04-07 13:10) [5]

>Раиса   (07.04.08 12:52) [4]
>а как надо написать-то?
определитесь с тем, что Вам нужно получить
и укажите СУБД


 
Раиса   (2008-04-07 14:02) [6]

Ms SQL

Цель: найти разницу между выборками из двух таблиц с одинаквой структурой.


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

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


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

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


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

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


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

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 ,
------- остальные принципиального значения не имеют.


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

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


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

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


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


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

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


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


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

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


 
ЮЮ ©   (2008-04-08 03:23) [15]

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


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

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


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

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


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

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


 
ЮЮ ©   (2008-04-10 04:01) [19]

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

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


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

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-11 03:38) [21]

И прямь, оказывается :(
При 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-11 08:57) [22]


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


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


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

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


 
evvcom ©   (2008-04-11 09:37) [24]

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


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


> Кщд   (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 11:30) [26]


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

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

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



Страницы: 1 вся ветка

Текущий архив: 2008.10.12;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.019 c
2-1220270981
aaaaa
2008-09-01 16:09
2008.10.12
Тригер в sql server


1-1199986299
MaX
2008-01-10 20:31
2008.10.12
Юникод в делфи


6-1194345147
SpellCaster
2007-11-06 13:32
2008.10.12
Время ожидания коннекта сокетом при недоступной сети


2-1220709929
Витя_1
2008-09-06 18:05
2008.10.12
FindFirstFile


2-1220207979
fog
2008-08-31 22:39
2008.10.12
MD5 и CryptoAPI