我见过有人建议通过这样做来交叉连接表本身:
SELECT *
FROM tbl AS A, tbl AS B
WHERE A.col1 = 1 AND B.col1 = 1
但是在这里,引擎需要迭代 tbl 中的所有行两次,以将两个查询与 A 和 B 的结果匹配,尽管查询(以及结果)是相同的。
假设 A 和 B 上的 WHERE 对于两者而言始终相同,这是一种浪费。有没有什么方法可以查询某件事一次,然后将该查询的结果交叉连接到其本身?我想避免临时表,这需要磁盘写入而不是在 RAM 中执行整个操作。
我正在使用 MySQL,尽管任何 SQL 答案都会有很大帮助。
示例:
假设 tbl 如下所示:
COL1 COL2
1 A
1 B
1 C
2 D
2 E
当我运行 col1 = 1 的 where 子句时,它返回上表中的前三行。我想要的是下表,但只执行一次 where 语句,因为两个表 A 和 B 是相同的:
A.COL1 A.COL2 B.COL1 B.COL2
1 A 1 A
1 A 1 B
1 A 1 C
1 B 1 A
1 B 1 B
1 B 1 C
1 C 1 A
1 C 1 B
1 C 1 C
最佳答案
您基本上是在要求有意的笛卡尔连接
select
a.col1,
a.col2,
b.col1,
b.col2
from
tbl a
join tbl b
on a.col1 = b.col1
where
a.col1 = 1
order by
a.col2,
b.col2
要准确命中输出顺序,您需要按“a”第 2 列排序,然后按“b”第 2 列排序
关于mysql - 连接表本身,无需两个查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9611843/