显示所有组合的 SQL 连接

发布于 2025-01-09 01:41:12 字数 3080 浏览 4 评论 0 原文

我想要一个“连接”,它可以让我知道每个类别(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');

cat:

在此处输入图像描述

cat_sites:

在此处输入图像描述

以下查询几乎正是我正在寻找的内容:

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 
;

有人对如何执行此操作有更好的想法吗?

I want a "join" that gives me every category (cat) and every site (cat_sites) knowing if they are associated to each other or not

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;

Having the following values:

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');

cat:

enter image description here

cat_sites:

enter image description here

The following query is almost exactly what I am looking for:

SELECT * FROM cat  LEFT JOIN cat_sites ON cat.cat = cat_sites.cat

The problem is, that I do get all categories, but only the sites actually assoicated to the given categories. For example "Autobus - Autocar" is only available in "BI", "LI" and "SW", but not in "EA" and "MA".

enter image description here

What I would like to see are records with c1="Autobus - Autocar" and the missing sites having c2 with null values.

I could get a result by passing by an intermediaire query which would give me all possible combinations:

SELECT cat.cat, site.site FROM cat 
RIGHT OUTER JOIN (select distinct site from cat_sites) AS site ON 1=1

The final query would then be something like this:

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 
;

Anyone have a better idea on how to do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

很糊涂小朋友 2025-01-16 01:41:12

您通常会交叉连接两个集合来查找所有可能的组合,然后使用左连接来查找匹配/缺失值:

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

You would normally cross join two sets to find all possible combinations, then use a left join to find matching/missing values:

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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文