我想要一個“加入”,讓我知道每個類別(cat)和每個站點(cat_sites)是否相互關聯
CREATE TABLE cat (
cat varchar(34) CHARACTER SET utf8 DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE cat_sites (
cat varchar(34) CHARACTER SET utf8 DEFAULT NULL,
site varchar(2) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
具有以下值:
INSERT INTO `cat` VALUES (''),('Autobus - Autocar'),('Camion / Tracteur de semi-remorque'),('Camionette'),('Motocycle'),('Remorque <3,5'),('Remorque >3,5'),('Tracteur'),('Tricycle / Quadricycle'),('V??hicule sp??cial'),('Voiture');
INSERT INTO `cat_sites` VALUES ('','EA'),('','MA'),('','SW'),('Autobus - Autocar','BI'),('Autobus - Autocar','LI'),('Autobus - Autocar','SW'),('Camion / Tracteur de semi-remorque','BI'),('Camion / Tracteur de semi-remorque','EA'),('Camion / Tracteur de semi-remorque','LI'),('Camion / Tracteur de semi-remorque','MA'),('Camion / Tracteur de semi-remorque','SW'),('Camionette','BI'),('Camionette','EA'),('Camionette','LI'),('Camionette','MA'),('Camionette','SW'),('Motocycle','BI'),('Motocycle','EA'),('Motocycle','MA'),('Motocycle','SW'),('Remorque <3,5','BI'),('Remorque <3,5','EA'),('Remorque <3,5','LI'),('Remorque <3,5','MA'),('Remorque <3,5','SW'),('Remorque >3,5','BI'),('Remorque >3,5','EA'),('Remorque >3,5','LI'),('Remorque >3,5','SW'),('Tracteur','BI'),('Tracteur','EA'),('Tracteur','LI'),('Tracteur','MA'),('Tracteur','SW'),('Tricycle / Quadricycle','BI'),('Tricycle / Quadricycle','EA'),('Tricycle / Quadricycle','MA'),('Tricycle / Quadricycle','SW'),('V??hicule sp??cial','BI'),('V??hicule sp??cial','LI'),('Voiture','BI'),('Voiture','EA'),('Voiture','LI'),('Voiture','MA'),('Voiture','SW');
貓:

貓網站:

以下查詢幾乎正是我正在尋找的:
SELECT * FROM cat LEFT JOIN cat_sites ON cat.cat = cat_sites.cat
問題是,我確實獲得了所有類別,但只有與給定類別相關的網站。例如“Autobus - Autocar”僅在“BI”、“LI”和“SW”中可用,但在“EA”和“MA”中不可用。

我想看到的是帶有 c1="Autobus - Autocar" 的記錄以及 c2 具有空值的缺失站點。
我可以通過一個中間查詢得到一個結果,它會給我所有可能的組合:
SELECT cat.cat, site.site FROM cat
RIGHT OUTER JOIN (select distinct site from cat_sites) AS site ON 1=1
最終的查詢將是這樣的:
SELECT cat_allsites.cat c1, cat_allsites.site, cat_sites.cat c2
FROM
(
SELECT cat.cat, site.site FROM cat
RIGHT OUTER JOIN (select distinct site from cat_sites) AS site ON 1=1
) as cat_allsites
LEFT JOIN cat_sites ON cat_allsites.cat = cat_sites.cat
WHERE cat_allsites.cat="Autobus - Autocar"
group by cat_allsites.cat , cat_allsites.site, cat_sites.cat
;
有人對如何做到這一點有更好的想法嗎?
uj5u.com熱心網友回復:
您通常會交叉連接兩個集合以查找所有可能的組合,然后使用左連接查找匹配/缺失值:
select cat.cat, sites.site, cat_sites.*
from cat
cross join (select distinct site from cat_sites) as sites
left join cat_sites on cat.cat = cat_sites.cat and sites.site = cat_sites.site
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/430917.html
下一篇:大寫和小寫的第一順序
