SQL Inequality присоединяется к возврату декартова произведения

У меня проблема с получением условий соединения для изоляции уникальных записей. Мой запрос возвращает декартовы произведения, и я не знаю, как это остановить. Мои таблицы выглядят так:

Table A         
ID_1    Start   End Name
137 1:00    2:00    Galia
137 2:00    3:00    Est
137 3:00    4:00    Omnia
137 4:00    5:00    Divisa
137 5:00    6:00    Partes
137 6:00    7:00    Tres
137 7:00    8:00    Quarum
137 8:00    9:00    Unam
137 9:00    10:00   Incolunt

Table B     
ID_1Time_1  Time_2
137 3:10    3:57

И мой запрос будет:

select A.*, B.Time_1, B.Time_2
from Table_A A
inner join
Table_B B
on 
A.ID_1 = B.ID_1 and B.Time_1<=A.End and B.Time_2 >= A.Start

И то, что я получаю, выглядит так:

ID_1Start   End Name    Time_1  Time_2
137 1:00    2:00    Galia   3:10    3:57
137 2:00    3:00    Est 3:10    3:57
137 3:00    4:00    Omnia   3:10    3:57
137 4:00    5:00    Divisa  3:10    3:57
137 5:00    6:00    Partes  3:10    3:57
137 6:00    7:00    Tres    3:10    3:57
137 7:00    8:00    Quarum  3:10    3:57
137 8:00    9:00    Unam    3:10    3:57
137 9:00    10:00   Incolunt3:10    3:57

Таким образом, похоже, что он дает декартово произведение двух таблиц, что имеет смысл, учитывая, что все три условия выполняются для каждой записи. Я хочу, чтобы возвращалась только запись, в которой время соответствует, например:

ID_1Start   End Name    Time_1  Time_2
137 3:00    4:00    Omnia   3:10    3:57

Любые советы о том, как структурировать объединение для достижения этой цели? Я работаю над коробкой Netezza, если это поможет с доступной функциональностью. Спасибо.


person TomR    schedule 22.04.2013    source источник
comment
какой тип данных у этих времен?   -  person Aprillion    schedule 22.04.2013
comment
как правильно 3:57 >= 9:00 верно?   -  person Aprillion    schedule 22.04.2013
comment
@Мистеру . . . С предоставленными данными ваш запрос должен работать правильно (т.е. возвращать одну строку). Вы уверены, что включили правильный запрос и примеры данных?   -  person Gordon Linoff    schedule 22.04.2013
comment
это не декартово произведение.   -  person Sebas    schedule 22.04.2013
comment
Это не настоящие данные, это конфиденциальные корпоративные данные, которые я, к сожалению, не могу опубликовать. Но эти данные отражают проблему. И это декартово произведение, потому что то, что, по-видимому, делает запрос, проверяет, встречаются ли соединения неравенства где-либо в таблице, а затем возвращает любую запись, в которой идентификаторы совпадают, таким образом давая декартово произведение идентификаторов и имен. Он возвращает несколько строк независимо от того, находятся ли неравенства в соединении или в предложении where.   -  person TomR    schedule 22.04.2013
comment
отбросил мой ответ, который был неправильным из-за моей путаницы между внутренним и внешним соединением (я все еще думал о предыдущем вопросе, извините за это), и завершил другой, который является правильным.   -  person didierc    schedule 23.04.2013
comment
Я должен был попробовать это, потому что я не мог видеть ничего плохого в этом. Я получил желаемый результат как есть.   -  person user1723033    schedule 12.01.2015


Ответы (1)


Вы хотите, чтобы применялись следующие условия:

    A.Start <= B.Time_1 <= B.Time_2 <= A.End

Предполагая, что типы данных столбца согласованы (т. е. хранят только время, а не дату и время или временные метки), и значения согласованы (т. е. центральный предикат в приведенном выше мультиотношении уже действителен). Эти условия можно переписать на SQL как

B.Time_2 <= A.End AND B.Time_1 >= A.Start

и нет

B.Time_1 <= A.End and B.Time_2 >= A.Start

что может соответствовать

B.Time_1 <= A.Start <= A.End <= B.Time_2

Следовательно:

select A.*, B.Time_1, B.Time_2
from Table_A A
inner join
Table_B B
on 
A.ID_1 = B.ID_1 and B.Time_1>=A.Start and B.Time_2 <= A.End
person Santosh Kewat    schedule 22.04.2013
comment
спасибо, надеюсь, вы не возражаете, если я дополню ваш ответ некоторыми пояснениями. - person didierc; 23.04.2013