Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2008.10.12;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.035 c
15-1219085284
programmer90
2008-08-18 22:48
2008.10.12
Нужен инсталлятор


2-1220237788
FIL-23
2008-09-01 06:56
2008.10.12
Сортировка масива


6-1193739381
Rav
2007-10-30 13:16
2008.10.12
Как правильно остановить IdTcpServer


2-1219300972
arbin
2008-08-21 10:42
2008.10.12
Шифровка значений констант в Дельфи


1-1199909700
maxistent
2008-01-09 23:15
2008.10.12
Потоки и процедуры...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский