Исправить подзапрос SQL, возвращающий несколько строк

Я запускаю этот запрос с оракулом, но получаю известную ошибку оракула ORA-01427: single-row subquery returns more than one row

Select
  DISTINCT s1.cityArrival,
  s2.cityDeparture,
  s2.sectionStartDate,
  userFirstName
FROM
  sections s1,
  sections s2,
  trajectory t,
  userInfo
WHERE
  s1.trajectId = s2.trajectId
  AND t.trajectId = s1.trajectId
  AND (
    s1.cityArrival = 'Paris'
    AND s2.cityDeparture = 'Rochelle'
  )
  AND driverMail = mailUser
  AND (
    Select
      availableSeats
    FROM
      sections s3
    WHERE
      s3.trajectId = s1.trajectId
      AND s2.sectionId <= s3.sectionId
      AND s3.sectionId <= s1.sectionId
  ) not IN (0)

Вот схема моей базы данных: enter image description here

Я хочу выбрать траектории с учетом даты и города прибытия и города отправления, имея для каждого раздела доступные места> 0. Проблема в том, что я не могу найти способ сделать это без цикла for в sql, и это становится сложным.

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

NB: я сделал дизайн БД, если у вас есть замечания по дизайну, не стесняйтесь, сообщите мне, заранее спасибо

Единственная часть, которая может вызвать эту ошибку, — это подзапрос по сравнению с NOT IN (0) (почему бы не использовать <>0). Здесь разделы имеют первичный ключ tracjectoryid и sectionid, но это запросы с оператором неравенства (<=). Это явно может вернуть более одной строки (и это так). Можете ли вы сказать, что должно произойти, когда это произойдет?

tinazmu 10.04.2022 13:25

Я получаю ту же ошибку Ошибка в запросе: ORA-01427: однострочный подзапрос возвращает более одной строки

rudeus123 10.04.2022 13:30

Это сводит меня с ума

rudeus123 10.04.2022 13:32

исправлено: 0 не IN (Выберите доступные места ...)

rudeus123 10.04.2022 13:33
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
4
27
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

..
  AND 0 not IN (
    Select
      availableSeats
    FROM
      sections s3
    WHERE
      s3.trajectId = s1.trajectId
      AND s2.sectionId <= s3.sectionId
      AND s3.sectionId <= s1.sectionId
  ) 

Ошибка была вызвана подзапросом перед предложением IN. Первая часть возвращает набор результатов, а не выражение. Вот синтаксис для использования предложения IN: https://docs.oracle.com/cd/B19306_01/server.102/b14200/conditions013.htm

С другой стороны, вы можете изменить последний подзапрос в предложении WHERE на

...
AND EXISTS (SELECT 1 
      FROM
      sections s3
    WHERE
      s3.trajectId = s1.trajectId
      AND s2.sectionId <= s3.sectionId
      AND s3.sectionId <= s1.sectionId
      AND s3.availableSeats > 0
)

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