- sql連接查詢包括:inner join、left join、right join和full join。
- 連接查詢有時作爲中間視圖處理結果的語句,會由於數據集重複導致最終的數據統計結果不正確。
- 解決:必須確保連接條件的唯一性。
- 參考:https://www.cnblogs.com/lijingran/p/9001302.html
前置數據準備
- 商品表(goods)
- 類別表(sort)
連接條件不唯一,導致結果集數據可能發生重複,導致結果不正確
select * from goods g
inner join sort s
on
g.sortcode = s.scode;
- left join: 保留左表所有的行,即使右表沒有匹配的記錄
select * from goods g
left join sort s
on
g.sortcode = s.scode;
- right join:保留右表所有的行,即使右表沒有匹配的記錄
select * from goods g
right join sort s
on
g.sortcode = s.scode;
select * from goods g
full join sort s
on
g.sortcode = s.scode;
連接條件唯一時
select * from goods g
inner join sort s
on
g.sortcode = s.scode
and
g.sortname = s.sname;
select * from goods g
left join sort s
on
g.sortcode = s.scode
and
g.sortname = s.sname;
select * from goods g
right join sort s
on
g.sortcode = s.scode
and
g.sortname = s.sname;
select * from goods g
full join sort s
on
g.sortcode = s.scode
and
g.sortname = s.sname;
CREATE TABLE goods (
gid varchar(32) NOT NULL,
gcode varchar(30) NOT NULL,
gname varchar(100) NOT NULL,
price numeric(20, 4) NOT NULL,
sortcode varchar(30) NOT NULL,
sortname varchar(100) NOT NULL,
PRIMARY KEY (gid)
);
CREATE TABLE sort (
sid varchar(32) NOT NULL,
scode varchar(30) NOT NULL,
sname varchar(100) NOT NULL,
PRIMARY KEY (sid)
);
INSERT INTO "public"."goods"("gid", "gcode", "gname", "price", "sortcode", "sortname") VALUES ('g0001', '0001', '康師傅可口可樂', '3.0000', '100002', '碳酸飲料A');
INSERT INTO "public"."goods"("gid", "gcode", "gname", "price", "sortcode", "sortname") VALUES ('g0002', '0002', '百世可樂', '4.0000', '100002', '碳酸飲料B');
INSERT INTO "public"."goods"("gid", "gcode", "gname", "price", "sortcode", "sortname") VALUES ('g0003', '0003', '酸奶', '2.0000', '100001', '牛奶');
INSERT INTO "public"."goods"("gid", "gcode", "gname", "price", "sortcode", "sortname") VALUES ('g0004', '0004', '雪碧', '3.5000', '100003', '碳酸飲料C');
INSERT INTO "public"."sort"("sid", "scode", "sname") VALUES ('s001', '100001', '牛奶');
INSERT INTO "public"."sort"("sid", "scode", "sname") VALUES ('s002', '100002', '碳酸飲料A');
INSERT INTO "public"."sort"("sid", "scode", "sname") VALUES ('s003', '100002', '碳酸飲料B');
INSERT INTO "public"."sort"("sid", "scode", "sname") VALUES ('s005', '200005', '麪食');