1

8 つのマスター テーブルがあり、各テーブルには約 60 万件のレコードがあります。

テーブル名が

type_11_14 
type_12_15
type_13_16
type_4_5
type_6
type_7
type_8
type_10

各テーブルには、コード名前の列があります。コード主キーです。これらのテーブルをすべて組み合わせて 1 つのテーブルにすることはできません。

上記の表では、type_11_14 にはタイプ 11 と 14 のレコードがあり、type_7 にはタイプ 7 のレコードがあります。

私は他のテーブルall_types_countを持っています。上記のタイプのカウント情報があります。指定されたタイプとコードのリスト (指定する最大コードは 50) について、その名前、タイプ、コード、およびカウントを取得する必要があります

UNION を使用して以下のクエリを作成しました。クエリは正常に実行されます。しかし、Explain plan を実行すると、

エラー 制約を有効にできませんでした。1 つ以上の行に、null 以外、一意、または外部キーの制約に違反する値が含まれています。

以下のクエリでも、all_types_countテーブルを 8 回クエリしています。その代わりに、最初にall_types_countからすべてのレコードを取得してから、必要な結果を得るためにマスター テーブルと結合することを考えました..

これに最適な SQL クエリ ソリューションが何であるかはわかりません。誰かが私に最善のアプローチを提供できますか?

SELECT type,code,total_count,type_11_14.name 
FROM all_types_count,type_11_14 
WHERE all_types_count.type in (11,14) 
AND all_types_count.code=type_11_14.code 
AND all_types_count.code in ( 3456,6789)

UNION ALL

SELECT type,code,total_count,type_12_15.name 
FROM all_types_count,type_12_15 
WHERE all_types_count.type in (12,15) 
AND all_types_count.code=type_12_15.code 
AND all_types_count.code in ( 2345,9087,234)

UNION ALL

SELECT type,code,total_count,type_13_16.name 
FROM all_types_count,type_13_16 
WHERE all_types_count.type in (13,16) 
AND all_types_count.code=type_13_16.code 
AND all_types_count.code in ( 98,24)

UNION ALL

SELECT type,code,total_count,type_4_5.name 
FROM all_types_count,type_4_5 
WHERE all_types_count.type in (4,5) 
AND all_types_count.code=type_4_5.code  
AND all_types_count.code in ( 765,9087,3456)

UNION ALL

SELECT type,code,total_count,type_6.name 
FROM all_types_count,type_6 
WHERE all_types_count.type=6 
AND all_types_count.code=type_6.code  
AND all_types_count.code in ( 5563,323,434,3442)

UNION ALL

SELECT type,code,total_count,type_7.name 
FROM all_types_count,type_7 
WHERE all_types_count.type=7 
AND all_types_count.code=type_7.code  
AND all_types_count.code in ( 7887,313,23,32,21)

UNION ALL

SELECT type,code,total_count,type_8.name 
FROM all_types_count,type_8 
WHERE all_types_count.type=8 
AND all_types_count.code=type_8.code  
AND all_types_count.code in ( 9988,1221)

UNION ALL

SELECT type,code,total_count,type_10.name 
FROM all_types_count,type_10 
WHERE all_types_count.type=10 
AND all_types_count.code=type_10.code  
AND all_types_count.code in ( 7787,23213)

ありがとうございました

キラン

4

1 に答える 1

1

次のように記述した場合、クエリはより効率的になります。

SELECT type,code,total_count,type_11_14.name 
FROM all_types_count 
left outer join type_11_14 
     on all_types_count.type in (11,14) 
     and all_types_count.code=type_11_14.code 
     and all_types_count.code in ( 3456,6789) 
left outer join type_12_15 
     on all_types_count.type in (12,15) 
     and all_types_count.code=type_12_15.code 
     and all_types_count.code in ( 2345,9087,234) 
left outer join  . . .

結合/左外部結合/右外部結合/クロス結合の構文に慣れていない場合は、学習する必要があります。

元のクエリでは、オプティマイザはサブクエリごとに all_types_count テーブルを読み取る可能性が最も高いでしょう。結合を使用すると、一度だけ読み取り、必要に応じて他のテーブルに結合する必要があります。

于 2012-04-29T21:00:04.807 に答える