在 SQL 中,连接两个不相关的表(即没有直接的外键关系或共同列)通常使用的是笛卡尔积(Cartesian Join),也称为交叉连接(Cross Join)。这种连接会返回两个表的所有可能的组合。
交叉连接会返回两个表的所有行的组合。假设我们有两个表 TableA
和 TableB
,它们没有任何共同的列或外键关系。
TableA
ID | Name |
---|---|
1 | Alice |
2 | Bob |
TableB
Code | Description |
---|---|
X | Item X |
Y | Item Y |
SELECT *
FROM TableA
CROSS JOIN TableB;
ID | Name | Code | Description |
---|---|---|---|
1 | Alice | X | Item X |
1 | Alice | Y | Item Y |
2 | Bob | X | Item X |
2 | Bob | Y | Item Y |
如果你想要连接两个不相关的表,但希望在结果中包含某些特定的逻辑,可以使用 INNER JOIN
或 LEFT JOIN
,并在 ON
子句中指定一个条件。即使没有直接的外键关系,你仍然可以使用某些逻辑条件来连接它们。
假设我们有两个表 Employees
和 Departments
,它们没有直接的外键关系,但我们希望将所有员工与所有部门组合在一起。
Employees
EmpID | EmpName |
---|---|
1 | John |
2 | Jane |
Departments
DeptID | DeptName |
---|---|
101 | HR |
102 | IT |
SELECT Employees.EmpID, Employees.EmpName, Departments.DeptID, Departments.DeptName
FROM Employees
INNER JOIN Departments ON 1=1;
EmpID | EmpName | DeptID | DeptName |
---|---|---|---|
1 | John | 101 | HR |
1 | John | 102 | IT |
2 | Jane | 101 | HR |
2 | Jane | 102 | IT |
在这个例子中,ON 1=1
是一个总是为真的条件,因此它会返回两个表的所有可能的组合,类似于 CROSS JOIN
。
如果你想要将两个不相关的表的数据合并到一个结果集中,但不需要进行行的组合,可以使用 UNION
或 UNION ALL
。这两个操作符用于将两个或多个 SELECT
语句的结果合并到一个结果集中。
UNION
:去除重复的行。UNION ALL
:保留所有行,包括重复的行。假设我们有两个表 Products
和 Services
,它们没有任何关系,但我们希望将它们的数据合并到一个结果集中。
Products
ProductID | ProductName |
---|---|
1 | Laptop |
2 | Mouse |
Services
ServiceID | ServiceName |
---|---|
101 | Repair |
102 | Installation |
SELECT ProductID AS ID, ProductName AS Name
FROM Products
UNION ALL
SELECT ServiceID AS ID, ServiceName AS Name
FROM Services;
ID | Name |
---|---|
1 | Laptop |
2 | Mouse |
101 | Repair |
102 | Installation |
在这个例子中,我们使用 UNION ALL
将两个表的数据合并到一个结果集中,并使用别名使列名一致。
SELECT
语句的结果合并到一个结果集中。领取专属 10元无门槛券
手把手带您无忧上云