1

数据库图

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

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

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

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

base_table ii 中的 base_id 将通过 C# 中的过程的另一件事 以下是给出错误的代码。

使用[香格里拉]
选择
一个来源,一个目的地,
b.flight_name,
c.flight_cost,c.flight_seat,c.flight_type,
d.flight_time
从
base_table a,
flight_main_table b,
flight_cost_table c,
flight_timing_table d
在哪里
a.base_id=109 和
b.base_id=109 和
c.flight_id=(select flight_id from flight_main_table where base_id=109) and
d.flight_id=(从 flight_main_table 中选择 flight_id,其中 base_id=109)
去


4

7 回答 7

2

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

于 2011-04-08T19:46:18.563 回答
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
于 2011-04-08T19:51:43.633 回答
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

不需要内部查询。

于 2011-04-08T19:49:33.697 回答
0

SELECT TOP 1 * FROM <tableName>

于 2011-04-08T19:46:00.160 回答
0

错误是试图让你知道子查询

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

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

于 2011-04-08T19:46:51.340 回答
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!

于 2011-04-08T19:47:16.547 回答
-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)
于 2011-04-08T19:48:22.867 回答