目次
4. SQL 結果セットを WHERE 句とマージする (UNION ALL)
5. ビジネスロジック重複排除後のマージ(UNION ALL)
2、「UNION タイプのタイムスタンプはタイムゾーンなしであり、テキストは一致しません」
I.はじめに
SQL (Structured Query Language) は、リレーショナル データベースを管理するための標準言語です。これにより、ユーザーは SQL 言語を使用してデータベース内のデータを操作できるようになります。SQL の UNION は、複数の SELECT ステートメントの結果を 1 つの結果セットに結合できる非常に強力な関数です。この記事では、GaussDB データベースを例として、UNION 演算子の使用法を紹介します。
二、GaussDB UNION/UNION ALL
1. GaussDB UNION オペレーター
GaussDB UNION 演算子は、2 つ以上の SELECT ステートメントの結果セットを結合するために使用されます。UNION 内の各 SELECT ステートメントには同じ数の列が必要であることに注意してください。列にも同様のデータ型が必要です。また、各 SELECT ステートメント内の列の順序は同じである必要があります。
2.構文の定義
1 ) UNION 構文
SELECT column1
,column2
,……
FROM table1
[WHERE condition]
UNION
SELECT column1
,column2
,……
FROM table2
[WHERE condition]
2 ) UNION ALL 構文
SELECT column1
,column2
,……
FROM table1
[WHERE condition]
UNION ALL
SELECT column1
,column2
,……
FROM table2
[WHERE condition]
注: UNION は 2 つ以上のセットをマージするときに重複排除操作を実行しますが、UNION ALL は重複排除を実行せずに 2 つ以上の結果セットを直接マージします。さらに、重複排除の実行には多くの時間がかかるため、実際のアプリケーション シナリオでは、2 つのコレクションに重複データがないことがビジネス ロジックで確認された場合、UNION を UNION ALL に直接置き換えてパフォーマンスを向上させることができます。
3. GaussDBの実験例
この論文では、GaussDB データベースを実験プラットフォームとして使用します。
1.実験テーブルの作成と初期化
1 ) 学生フォームの学生情報(ID、名前、性別、都市)
--创建学生信息表
CREATE table student(
sId VARCHAR(10) NOT NULL
,sname VARCHAR(10) NOT NULL
,ssex VARCHAR(10) NOT NULl
,scity VARCHAR(10) NOT NULl
);
--初识化实验数据
INSERT INTO student VALUES('s01' , '赵雷' , '男', 'XIAN');
INSERT INTO student VALUES('s02' , '钱电' , '男', 'YUNNAN');
INSERT INTO student VALUES('s03' , '孙风' , '男', 'NIXIA');
INSERT INTO student VALUES('s04' , '李云' , '男', 'XIZANG');
INSERT INTO student VALUES('s05' , '周梅' , '女', 'XINJIANG');
INSERT INTO student VALUES('s06' , '吴兰' , '女', 'CHENGDU');
INSERT INTO student VALUES('s07' , '郑竹' , '女', 'XIAN');
INSERT INTO student VALUES('s08' , '张三' , '女', 'CHENGDU');
--查看结果集
SELECT * FROM student;
2 ) 教師情報フォーム(ID、名前、性別、市区町村)
--创建教师信息表
CREATE table teacher(
teid VARCHAR(10) NOT NULL
,tname VARCHAR(10) NOT NULL
,tsex VARCHAR(10) NOT NULL
,tcity VARCHAR(10) NOT NULL
);
--初始化实验数据
INSERT INTO teacher VALUES('t01' , '张磊', '男', 'XIAN');
INSERT INTO teacher VALUES('t02' , '李强', '男', 'BEIJING');
INSERT INTO teacher VALUES('t03' , '王刚', '男', 'XINJIANG');
--查看结果集
SELECT * FROM teacher;
2.結合と重複排除 (UNION)
--生徒と教師が所属する都市を取得し、都市名の最初の文字が昇順に並べ替えます。
SELECT t.city
FROM (
SELECT scity AS city
FROM student
UNION
SELECT tcity AS city
FROM teacher
) t
ORDER BY t.city ASC;
結果セットは以下のスクリーンショットに示されているとおりであり、都市データの重複はありません。
3.重複排除なしで結合 (UNION ALL)
--すべての生徒と教師が所属する都市を取得し、都市名の最初の文字が昇順に並べ替えます。
SELECT t.city
FROM (
SELECT scity AS city
FROM student
UNION ALL
SELECT tcity AS city
FROM teacher
) t
ORDER BY t.city ASC;
結果セットは以下のスクリーンショットに示されており、すべての都市データがリストされています。
4. SQL 結果セットを WHERE 句とマージする (UNION ALL)
-- 「XIAN」から生徒と教師のすべての情報を取得し、生徒と教師の数で昇順に並べ替えます。
SELECT t.*
FROM
(SELECT Sid AS id
,Sname AS name
,Ssex AS sex
,Scity AS city
FROM student WHERE Scity='XIAN'
UNION ALL
SELECT Tid AS id
,Tname AS name
,Tsex AS sex
,Tcity AS city
FROM teacher WHERE Tcity='XIAN') t
ORDER BY t.id ASC;
結果セットは以下のスクリーンショットに示されており、「XIAN」の生徒と教師のすべての情報がリストされています。
5.ビジネスロジック重複排除後のマージ(UNION ALL)
たとえば、上流システムが提供する 2 つ以上のテーブルが相互に重複データを保存せず、テーブル自体にも重複データがない場合、マージ時の SQL パフォーマンスを向上させ、SQL 実行時間を短縮するために、UNION を選択するビジネス シナリオもあります。 ALL 演算子。
4. GaussDB UNION のよくあるエラー
1、「各 UNION クエリには同じ数の列が必要です」
解決策: プロンプトに従って 2 つのテーブルのテーブル構造を確認し、フィールドの数が 1 つであるかどうかを確認します。
2、「UNION タイプのタイムスタンプにはタイムゾーンが含まれておらず、テキストは一致しません」
解決策: プロンプトに従って 2 つのテーブルのテーブル構造を確認し、フィールドの型が一致しているかどうかを確認します。
V. まとめ
実際のビジネス シナリオでは、GaussDB データベースを選択する場合でも、他のリレーショナル データベースを選択する場合でも、UNION および UNION ALL を使用する場合は次の点に注意する必要があります。
- 左側と右側の SQL フィールドの数とタイプは一貫している必要があります。
- ビジネスでデータの重複排除を考慮する必要があるかどうか (マージ前の重複排除またはマージ中の重複排除)。
- テーブル内のデータのサイズに応じて、SQL の実行効率を評価し、遷移用の一時テーブルを選択してマージする必要があるかどうかを検討する必要があります。
- SQLを書くためにSQLを書くことはできず、SQLを書く複雑さを考慮する必要があり、ビジネスニーズに基づいて選択する必要があります。
- 仕上げる