Является ли запрос с пересечением эквивалентным «где a и b»? - PullRequest
4 голосов
/ 01 января 2012

У меня есть БД с postgresql, и я написал два простых запроса

select page from title where word = 'france' and part = 'headline';

и

select page from title where word = 'france' 
intersect 
select page from title where part = 'headline';

Я думаю, что они должны вернуть тот же результат, но на самом деле это другой. Есть предложения?

Структура таблицы - это просто id, word, page, part.

EDIT:

Я пробовал также

выберите отличный

но запрос с пересечением всегда возвращает не относящиеся к делу результаты. Это БД простой обратной таблицы некоторых новостных веб-страниц. Так что страница, слово и часть не уникальны. Но нет дублированных записей.

Ответы [ 2 ]

4 голосов
/ 01 января 2012

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

Обновление: Они не одинаковы. правильный ответ - это то, что Демс уже объяснил (я проголосовал за его ответ):

page  word     part
1     france   headline
2     uk       headline
2     france   body

слово = франция и часть = заголовок => страница 1

слово = франция => стр. 1, 2 часть = заголовок => стр. 1, 2

пересечение двух предыдущих комплектов => стр. 1, 2

Обновление2: Ответ на вопрос: как заставить пересечение дать тот же результат? Пересечение должно быть сделано над столбцом в условиях, как здесь.

select page, word, part from title where word = 'france' 
intersect 
select page, word, part from title where part = 'headline'
4 голосов
/ 01 января 2012

WHERE (a) AND (b) - логическое условие, применяемое к каждой записи. Запись включается только в том случае, если она удовлетворяет условию целом . Другими словами, будут включены только записи, в которых word является 'францией' И part является 'заголовком' одновременно .

1010 *
*

То, что вам нужно, больше похоже на использование OR в вашем состоянии?

select page from title where word = 'france' or part = 'headline';


Или у вас проблемы из-за того, что на одну страницу ссылается несколько записей?

Например ...

1 | 'france'  | 'aaa' | 'headline'
2 | 'france'  | 'bbb' | 'body'
3 | 'germany' | 'bbb' | 'headline'

'aaa' будут возвращены обоими вашими запросами.

'bbb' будет возвращен только ваш второй запрос.

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