SQL: разные результаты при использовании подстановочного знака?

Использование 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

Однако, когда я подсчитываю любой из них, я получаю большее количество строк. Например. количество всех постов.

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

подстановочный знак предназначен только для того, чтобы не записывать все поля, которые можно выбрать, он больше ничего не означает. Оба запроса возвращают одни и те же строки

Gonzalo.- 09.04.2019 20:32

Ни один из этих запросов не возвращает декартово произведение двух таблиц.

forpas 09.04.2019 20:35

количество строк, возвращаемых двумя запросами, одинаково..

ScaisEdge 09.04.2019 20:43

Это НЕ декартовы произведения.

The Impaler 09.04.2019 20:45

@a_horse_with_no_name Я вижу результаты с разными номерами строк в PSQL, когда запускаю эти два запроса. Может быть, это не декартово произведение, но количество видимых строк совсем не то же самое.

steel 09.04.2019 20:47

Даже учитывая, что ваш вопрос написан не очень хорошо, мы все равно можем вам помочь, если вы добавите образцы данных и ожидаемые результаты. Несколько строк данных помогут нам увидеть проблему.

The Impaler 09.04.2019 20:47

Я обновил вопрос, чтобы избежать слова «декартовский», потому что я могу неправильно его понять.

steel 09.04.2019 20:48

О, дорогой, я нашел время, чтобы ответить теперь, когда вы изменили вопрос.

Ely 09.04.2019 20:50

Это изменится, если вы побежите reindex authors;?

a_horse_with_no_name 09.04.2019 21:03
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
9
84
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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 возвращает одинаковое значение для обоих.

steel 09.04.2019 20:50

Я вижу, это имеет смысл. Если вы считаете строки визуально, может ли приложение, которое вы используете для выполнения запроса, иметь какое-то специфическое поведение при отображении данных. Например. когда я использую SQL Developer, он отображает первые 50 строк; остальные строки отображаются постепенно по запросу, когда я прокручиваю до конца списка результатов. Есть ли смысл в том, что ваше приложение также имеет определенное поведение? Какой инструмент вы используете для выполнения запросов SQL?

Ely 09.04.2019 20:53

Я вижу это с postbird и psql (оба в Ubuntu 18.04)

steel 09.04.2019 20:57

К сожалению, я не знаком с postbird или psql. Если вы запустите тест Равишанкара и увидите такое же количество строк, можете не сомневаться — это специфическое поведение инструмента, вы, вероятно, видите именно то, что инструмент решил отобразить. Результаты по-прежнему правильные.

Ely 09.04.2019 21:03

Большое спасибо за ваше терпение и помощь, несмотря на то, что я неправильно использовал этот термин. Это действительно была проблема, связанная с инструментом. Когда я прокручиваю вниз в psql, я вижу оставшиеся строки, как и ожидалось, но не в графическом интерфейсе.

steel 09.04.2019 21:13

Не беспокойтесь, все хорошо.

Ely 09.04.2019 21:49
Ответ принят как подходящий

Проблема может быть вызвана тем, как вы выполняете запрос, и настройками 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, я вижу оставшиеся результаты. Спасибо!

steel 09.04.2019 21:12

Другие вопросы по теме