2

WebサーバーからDBAサーバーへの接続が非常に遅く、単一のWeb要求を処理するために一連の3つのクエリを実行する必要があると想定します。クエリを1つにまとめる方法はありますか?次のシナリオを想定します

person.id person.name
1         James
2         Stacy

country.id country.name
1          USA
2          UK

location.person_id location.country_id
1                  1
1                  2

Webフォームは、name = "James" country = "China"という2つの変数を投稿し、次のようにします。

  • 「ジェームズ」は存在しますか、存在しない場合は、ジェームズを挿入します
  • 「中国」は存在しますか、存在しない場合は、中国を挿入します
  • 「ジェームズ」は「中国」に住んでいますか、関係を挿入しない場合

すなわちのようなもの

select person.id, country.id, location.person_id
from person, country, location
where
    person.name="James" and
    country.name="China" and
    person.id=location.id and country.id=location.country_id

上記のクエリは、個人、国、または場所のいずれかが存在しない場合、レコードを返さないため、役に立ちません。

ストアドプロシージャを使用してこれを行うことは可能ですが、すべてのデータベースがストアドプロシージャをサポートしているわけではありません。

4

4 に答える 4

4

次のようなものを試してください(を使用してくださいUNION):

SELECT 
    id  as id,
    'PERSON' as type
FROM person
WHERE name = 'James'
UNION
SELECT 
    id as id,
    'COUNTRY' as type
FROM country
WHERE name = 'China'
UNION
SELECT 
    person_id as id,
    'LOCATION' as type
FROM location
JOIN person ON person.id = location.person_id
JOIN country ON country.id = location.country_id
WHERE person.name = 'James'
AND   country.name = 'China'

これにより、それぞれの名前に一致するすべての行とそのタイプが表示されます。raheel shanの答えを見ると、もっと速いと思います。これを実行可能な代替案と考えてください:-)

于 2012-04-05T06:20:38.730 に答える
4

解決策は非常に簡単です

SELECT (SELECT person.id from person WHERE person.name = 'James') as Name,
       (SELECT country.id from country WHERE country.name="China") as Country,
       (SELECT location.person_id from location WHERE person.id = location.id and country.id = location.country_id and person.name = 'James' and country.name="China") as Location
于 2012-04-05T06:21:12.393 に答える
1

MSSQL(質問からはわかりにくい)を使用している場合は、複数のレコードセットをサポートしています。接続文字列を介して有効にし、ストアドプロシージャから複数の選択を実行し、データセットを介して複数のデータテーブルとしてアクセスします...

于 2012-04-05T06:32:40.077 に答える
0

1つのデータセットでデータ全体を取得しても問題がない場合は、完全結合を使用する必要があります

select person.*, country.*, location.*
from person
full join location
on person.id=location.id
full join country
on country.id=location.country_id
where isnull(person.name,'James')='James' and
isnull(country.name,'China')='China'
于 2012-04-05T06:29:11.437 に答える