如何从sql select查询获得单个结果! SQL

时间:2011-04-08 19:41:29

标签: sql sql-server nested-queries

database diagram

以上是我的数据库图表中我遇到问题的部分!

在3个外部表base_table和3个表的引用的帮助下从3个表中选择列。 但是Sql显示错误

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

如何解决这个问题!有没有更好的方法来做到这一点。 我是sql的新手,这是我学校项目的一部分

base_table的base_id还有一件事我将通过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 个答案:

答案 0 :(得分:2)

问题是子查询(select flight_id from flight_main_table where base_id=109)返回多个结果,当使用=运算符作为子查询的结果时,不允许这样做。您可以使用keywork IN而不是=,或者确保子查询每个base_id只包含一个结果。

答案 1 :(得分:2)

我使用显式连接和一些更有意义的表别名来清理查询。我们试试这个:

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

答案 2 :(得分:1)

嗯..我非常困惑。通过更改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

不需要内部查询。

答案 3 :(得分:0)

答案 4 :(得分:0)

错误是试图你的子查询

select flight_id from flight_main_table where base_id=109

返回多个值。这是一个问题,因为您尝试使用c.flight_id加入=,这意味着它会尝试根据{右侧的值}从c中选择一行{1}}。如果您想要多个值的可能性,则需要=关键字。尝试将其更改为

in

如果有意义子查询返回多个值。如果返回多个值没有意义,可能是时候确保您的数据是干净的了。

答案 5 :(得分:0)

似乎base_id可以对应多个flight_id。我不知道你的要求,所以我不能说这是对还是错。

如果您想要每个base_id有多个flight_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) 

如果你真的想要每个base_id有一个唯一的flight_id,那么你将不得不改变你的模型和数据。

PS:你可以使用JOIN!

答案 6 :(得分:-1)

在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)