SQL 无关联条件拼接
场景:A 表 1 行、B 表 1 行,无任何关联字段,横向拼成 1 条记录,不能用JOIN(没有 on 条件),分两种写法:
1、横向合并(列增多,最常用,一行结果)
方案 1:CROSS JOIN(笛卡尔积,单行 × 单行 = 1 行)
sql
SELECT *
FROM (SELECT * FROM TableA) t1
CROSS JOIN (SELECT * FROM TableB) t2;
CROSS JOIN 不需要 ON,两张表行数相乘,A1 行 + B1 行 = 结果 1 行。
方案 2:逗号旧式交叉连接(等价 CROSS JOIN)
sql
SELECT *
FROM (SELECT TOP 1 * FROM TableA) A,
(SELECT TOP 1 * FROM TableB) B;
如果表有多行,只想取各自第一条拼接:
sql
SELECT *
FROM (SELECT TOP 1 * FROM TableA) A
CROSS JOIN (SELECT TOP 1 * FROM TableB) B;
2、纵向合并(行变多,上下拼接,用 UNION ALL)
需求:A1 行放上面,B1 行放下面,变成 2 行
sql
SELECT * FROM TableA
UNION ALL
SELECT * FROM TableB;
UNION 要求两张表字段数量、数据类型一一对应,字段名可以不一样。
实操示例
sql
-- 测试表
CREATE TABLE T1(id1 INT,name1 VARCHAR(10));
CREATE TABLE T2(id2 INT,name2 VARCHAR(10));
INSERT INTO T1 VALUES(1,'张三');
INSERT INTO T2 VALUES(2,'李四');
-- 横向拼成1行
SELECT * FROM T1 CROSS JOIN T2;
输出:
表格
id1 name1 id2 name2
1 张三 2 李四
补充:指定字段,避免 *
sql
SELECT t1.id1,t1.name1,t2.id2,t2.name2
FROM (SELECT TOP 1 id1,name1 FROM T1) t1
CROSS JOIN (SELECT TOP 1 id2,name2 FROM T2) t2
