以上是我的数据库图表中我遇到问题的部分!
在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
答案 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
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)