我见过有人建议通过这样做来交叉加入一个表:
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