Использование PostgreSQL 9.6.12.
Учитывая, что у автора много сообщений в блоге.
Когда я запускаю следующий запрос, я получаю строку для каждого связанного сообщения.
SELECT authors.id
FROM authors
LEFT JOIN posts ON authors.id = posts.author_id
Когда я запускаю следующее, я получаю только строку для каждого автора:
SELECT authors.*
FROM authors
LEFT JOIN posts ON authors.id = posts.author_id
Однако, когда я подсчитываю любой из них, я получаю большее количество строк. Например. количество всех постов.
Почему я не получаю большее количество строк, когда использую подстановочный знак для выбора всех столбцов?
Ни один из этих запросов не возвращает декартово произведение двух таблиц.
количество строк, возвращаемых двумя запросами, одинаково..
Это НЕ декартовы произведения.
@a_horse_with_no_name Я вижу результаты с разными номерами строк в PSQL, когда запускаю эти два запроса. Может быть, это не декартово произведение, но количество видимых строк совсем не то же самое.
Даже учитывая, что ваш вопрос написан не очень хорошо, мы все равно можем вам помочь, если вы добавите образцы данных и ожидаемые результаты. Несколько строк данных помогут нам увидеть проблему.
Я обновил вопрос, чтобы избежать слова «декартовский», потому что я могу неправильно его понять.
О, дорогой, я нашел время, чтобы ответить теперь, когда вы изменили вопрос.
Это изменится, если вы побежите reindex authors;
?
Why don't I get a cartesian product result when I use the wildcard to select all the columns?
Вы не получаете декартово произведение ни в одном из двух SQL-запросов.
When I run a count on either one, however, I get the cartesian product number of rows. E.g. the count of all the posts.
Вы не считаете количество всех сообщений. Вы получаете все сообщения, автор которых указан в таблице authors
.
Боюсь, вы путаете термин декартово произведение. Декартово произведение — это количество строк в первой таблице, умноженное на количество строк во второй таблице, без ограничительного пункта/условия. В простом SQL это будет соответствовать следующему, например:
SELECT * FROM authors, posts
Два запроса в вашем вопросе возвращают одни и те же строки, за исключением того, что первый запрос отображает только столбец id
таблицы authors
, а второй отображает все столбцы таблицы authors
.
Это стандартный SQL, и я уверен, что каждая технология, поддерживающая стандарт SQL, будет соблюдать вышесказанное.
Я надеюсь, вы понимаете, что я имею в виду, и предлагаю вам просмотреть вопрос. Это может помочь, если вы можете показать какой-то конкретный пример, в частности, вам нужно будет уточнить:
Спасибо за ваш ответ. Это произошло сразу после того, как я отредактировал вопрос, убрав термин «декартово произведение». Я просто считаю ряды визуально. Использование count
возвращает одинаковое значение для обоих.
Я вижу, это имеет смысл. Если вы считаете строки визуально, может ли приложение, которое вы используете для выполнения запроса, иметь какое-то специфическое поведение при отображении данных. Например. когда я использую SQL Developer, он отображает первые 50 строк; остальные строки отображаются постепенно по запросу, когда я прокручиваю до конца списка результатов. Есть ли смысл в том, что ваше приложение также имеет определенное поведение? Какой инструмент вы используете для выполнения запросов SQL?
Я вижу это с postbird и psql (оба в Ubuntu 18.04)
К сожалению, я не знаком с postbird или psql. Если вы запустите тест Равишанкара и увидите такое же количество строк, можете не сомневаться — это специфическое поведение инструмента, вы, вероятно, видите именно то, что инструмент решил отобразить. Результаты по-прежнему правильные.
Большое спасибо за ваше терпение и помощь, несмотря на то, что я неправильно использовал этот термин. Это действительно была проблема, связанная с инструментом. Когда я прокручиваю вниз в psql, я вижу оставшиеся строки, как и ожидалось, но не в графическом интерфейсе.
Не беспокойтесь, все хорошо.
Проблема может быть вызвана тем, как вы выполняете запрос, и настройками IDE. Эти запросы должны возвращать одинаковое количество строк. Пожалуйста, выполните следующие запросы для проверки.
select count(*) from (SELECT authors.id
FROM authors
LEFT JOIN posts ON authors.id = posts.author_id)
select count(*) from (SELECT authors.*
FROM authors
LEFT JOIN posts ON authors.id = posts.author_id)
Хорошо подмечено. Я использую новый графический интерфейс, и он усекает результаты. Когда я прокручиваю вниз в psql, я вижу оставшиеся результаты. Спасибо!
подстановочный знак предназначен только для того, чтобы не записывать все поля, которые можно выбрать, он больше ничего не означает. Оба запроса возвращают одни и те же строки