Главная страница
    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.5 MB
Время: 0.047 c
1-1200405748
istok
2008-01-15 17:02
2008.10.12
передача событий из потока...


15-1219090059
Alien1769
2008-08-19 00:07
2008.10.12
pppoe


2-1220801949
Начинающий1
2008-09-07 19:39
2008.10.12
Логарифм


15-1219226478
silver222
2008-08-20 14:01
2008.10.12
Вывод фотографий


15-1218900402
Andy BitOff
2008-08-16 19:26
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский