Странность SQL при использовании 2 таблиц в запросе - PullRequest
1 голос
/ 30 марта 2011

Коллега создавал запрос для двух настроенных им таблиц - Время Великобритании и Время Египта . SQL для его запроса был так:

SELECT Sum([UK Time].[Hours Booked]), [UK Time].[First Name], [UK Time].[Last Name], [UK Time].[Month] 

FROM [UK Time], [Egypt Time]
GROUP BY [UK Time].[First Name], [UK Time].[Last Name], [UK Time].[Month] 
HAVING (([UK Time].[First Name])="Geoff"), ([UK Time].[Month])="September 2009"));

по британскому времени было 18 результатов, которые соответствовали и «Джеффу», и «сентябрю 2009 года», а Египетскому времени было в общей сложности 6022 записи ( британскому времени было похожее общее количество).

При выполнении этого запроса он возвращает 18 результатов, но дублирует их по 6022 раза каждый, что дает в общей сложности 108396 записей в запросе. Когда Египетское время было удалено из запроса, показывались только 18 результатов.

Мой коллега просто создал два запроса сейчас, по одному на таблицу, но я надеялся, что кто-нибудь здесь сможет объяснить это поведение.

Ответы [ 3 ]

3 голосов
/ 30 марта 2011

Чтобы расширить ответ Кевина:

A CARTESIAN или FULL OUTER JOIN в основном дает произведение таблиц, причем строка в наборе результатов для каждой строки в левой таблице совпадает с каждой строкой в ​​правой таблице.

Это имеет свои применения, но они редки.

Вы хотите сделать что-то вроде

...
FROM LeftTable
INNER JOIN RightTable ON LeftTable.Key = RightTable.Key
WHERE ...

Это даст вам только те записи, которые совпадают между двумя таблицами.

3 голосов
/ 30 марта 2011

Что ж, так и было бы, вы не сказали, как объединить две таблицы, так что это декартово объединение, которое объединяет каждую строку с каждой другой строкой!

Google Inner Join, чтобы увидеть некоторые примеры того, каксделать это

2 голосов
/ 30 марта 2011

Вы не упомянули, каких результатов вы пытаетесь достичь, но я считаю, что вам нужно использовать UNION:

SELECT Sum([UK Time].[Hours Booked]), [UK Time].[First Name], [UK Time].[Last Name], [UK Time].[Month] 
FROM [UK Time] 
GROUP BY [UK Time].[First Name], [UK Time].[Last Name], [UK Time].[Month] 
HAVING (([UK Time].[First Name])="Geoff"), ([UK Time].[Month])="September 2009"))
UNION
SELECT Sum([Egypt Time].[Hours Booked]), [Egypt Time].[First Name], [Egypt Time].[Last Name], [Egypt Time].[Month] 
FROM  [Egypt Time]
GROUP BY [Egypt Time].[First Name], [Egypt Time].[Last Name], [Egypt Time].[Month] 
HAVING (([Egypt Time].[First Name])="Geoff"), ([Egypt Time].[Month])="September 2009"));
;

В настоящее время вы получаете декартово произведение, как объяснил КевинРосс и JNK :

SELECT * FROM tablea, tableb 

всегда возвращаются (#rows в таблице раз #rows в таблицеb)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...