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#のプロシージャを通過するもう1つのこと以下は、エラーを発生させるコードです。

USE[シャングリラ]
選択する
a.source、a.destination、
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 =(base_id =109の場合はflight_main_tableからflight_idを選択)および
d.flight_id =(base_id =109の場合はflight_main_tableからflight_idを選択)
行く


4

7 に答える 7

2

問題は、サブクエリ(select flight_id from flight_main_table where base_id=109)が複数の結果を返すことです。これは、サブクエリの結果に=演算子を使用する場合は許可されません。=の代わりにキーワークINを使用するか、サブクエリにbase_idごとに1つの結果のみが含まれるようにすることができます。

于 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を使用して結合しようとしたため、これは問題です。つまり、の右側の値に基づいて=1つの行を選択しようとします。複数の値の可能性が必要な場合は、キーワードが必要です。に変更してみてください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 に答える