Форум: "Базы";
Текущий архив: 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.043 c