sql подзапросов! проблема с любым оператором в запросе basi c sql. Не знаю, почему это требуется в моем запросе и как это будет работать? - PullRequest
0 голосов
/ 12 апреля 2020

Я получаю следующую ошибку

Скалярный подзапрос содержит более одной строки; SQL заявление: выберите * из поездки, где цена = (выберите цену из hiking_trip); [90053-193]

Из SQL

SELECT *
FROM trip
WHERE price =  (
  SELECT price
  FROM hiking_trip
);

Я знаю, что ошибка исчезнет, ​​если я добавлю ANY к моему коду после =. но я не понимаю, почему это не работает? Разве это не должно дать мне цену, равную данному условию? и почему ANY заставит это работать?

ОБНОВЛЕНИЕ: я получил точку, которую вы мне сказали, но затем

выберите * из страны, где существует (выберите * с горы, где mountain.country_id = страна .id);

в этом запросе не будет ли оператор select * в подзапросе возвращать более одной строки или столбца, пока он работает здесь ??

Ответы [ 3 ]

0 голосов
/ 12 апреля 2020

Это потому, что подзапрос SELECT price FROM hiking_trip возвращает несколько строк.

Вам нужно будет использовать IN вместо =, чтобы он работал.

SELECT * FROM trip WHERE price IN ( SELECT price FROM hiking_trip );
0 голосов
/ 12 апреля 2020

Это потому, что ваш подзапрос возвращает более одной строки.

Вы можете использовать IN вместо =

SELECT * FROM trip WHERE price IN ( SELECT price FROM hiking_trip );

или вы можете использовать LIMIT

SELECT * FROM trip WHERE price = (SELECT price FROM hiking_trip LIMIT 1)

, который отфильтрует результат подзапроса с первой строкой

0 голосов
/ 12 апреля 2020

Сбой, потому что = ожидает одно значение для сравнения, а не список значений, который возвращает select. Технически, он хочет скалярный подзапрос - подзапрос, который возвращает 1 столбец и 0 или 1 строку.

Вы можете исправить проблему синтаксиса разными способами.

Использование агрегация для возврата одного значения:

WHERE trip.price = ( SELECT MAX(price) FROM hiking_trip )

Используйте limit для возврата одного значения:

WHERE trip.price = (SELECT price FROM hiking_trip LIMIT 1)

Используйте in для соответствия любому значению:

WHERE trip.price IN (SELECT price FROM hiking_trip)

Используйте any:

WHERE trip.price = ANY (SELECT price FROM hiking_trip)
...