Как получить один результат из запроса выбора SQL! SQL - PullRequest
1 голос
/ 08 апреля 2011

database diagram

выше - это часть моей диаграммы базы данных, где у меня возникает проблема!

выбор столбцов из 3 таблиц с помощью ссылок из 1 внешней таблицы base_table и 3 table,Но Sql отображает ошибку

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >

Как решить эту проблему!Есть ли лучший способ сделать это.Я новичок в SQL, и это часть моего школьного проекта

Еще одна вещь, base_id из base_table ii будет проходить через процедуру в C # Ниже приведен код, который дает ошибку.

USE [shangrila]
select 
a.source,a.destination,
b.flight_name,
c.flight_cost,c.flight_seat,c.flight_type,
d.flight_time
from
base_table a,
flight_main_table b,
flight_cost_table c,
flight_timing_table d
where
a.base_id=109 and
b.base_id=109 and
c.flight_id=(select flight_id from flight_main_table where base_id=109) and
d.flight_id=(select flight_id from flight_main_table where base_id=109) 
go


Ответы [ 7 ]

2 голосов
/ 08 апреля 2011

Проблема в том, что подзапрос (select flight_id from flight_main_table where base_id=109) возвращает более одного результата, что недопустимо при использовании оператора = для результата подзапроса.Вы можете использовать клавиатуру IN вместо = или убедиться, что подзапрос содержит только один результат для base_id.

2 голосов
/ 08 апреля 2011

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

SELECT bt.source, bt.destination,
       fmt.flight_name,
       fct.flight_cost, fct.flight_seat, fct.flight_type,
       ft.flight_time
    FROM flight_main_table fmt
        INNER JOIN base_table bt
            ON fmt.base_id = bt.base_id
        INNER JOIN flight_cost_table fct
            ON fmt.flight_id = fct.flight_id
        INNER JOIN flight_timing_table ft
            ON fmt.flight_id = ft.flight_id
    WHERE fmt.base_id = 109
1 голос
/ 08 апреля 2011

Хм .. Я в замешательстве. Ваш запрос может быть очень легко переписан, чтобы избежать ошибки, изменив предложение where.

where
a.base_id=109 and
b.base_id= a.base_id and
c.flight_id= b.flight_id and
d.flight_id=b.flight_id

Внутренний запрос не нужен.

0 голосов
/ 08 апреля 2011

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

c.flight_id=(select flight_id from flight_main_table where base_id=109)

на

c.flight_id=(select flight_id from flight_main_table where base_id=109 limit 1)

или, если вы хотите сопоставить любое из значений, вы можете сделать

c.flight_id in (select flight_id from flight_main_table where base_id=109)
0 голосов
/ 08 апреля 2011

Кажется, что base_id может соответствовать более чем одному flight_id. Я не знаю ваших требований, поэтому не могу сказать, правильно это или неправильно.

Если вы хотите использовать несколько flight_id для base_id, то измените

c.flight_id=(select flight_id from flight_main_table where base_id=109) and
d.flight_id=(select flight_id from flight_main_table where base_id=109) 

до

c.flight_id IN (select flight_id from flight_main_table where base_id=109) and
d.flight_id IN (select flight_id from flight_main_table where base_id=109) 

Если вы действительно хотите, чтобы уникальный идентификатор flight_id указывал base_id, вам придется изменить модель и данные.

PS: Вы можете использовать JOIN!

0 голосов
/ 08 апреля 2011

Ошибка пытается вам, что подзапрос

select flight_id from flight_main_table where base_id=109

возвращает более одного значения.Это проблема, потому что вы пытались присоединить c.flight_id к нему, используя =, что означает, что он попытается выбрать одну строку из c на основе значения в правой части =.Если вы хотите использовать несколько значений, вам нужно ключевое слово in.Попробуйте изменить его на

...
c.flight_id in (select flight_id from flight_main_table where base_id=109) and
d.flight_id in (select flight_id from flight_main_table where base_id=109)
...

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

0 голосов
/ 08 апреля 2011
...