将MySQL子查询存储在变量中

10

是否有可能将mysql子查询存储起来,以便稍后可以再次用作子查询?这样做可能会产生更清晰的代码并节省解析开销。

例如在以下外部连接中:

SELECT * FROM t1
LEFT JOIN (SELECT * FROM t2 WHERE t2.foo=='bar') ON t1.id = t2.id
UNION
SELECT * FROM t1
RIGHT JOIN (SELECT * FROM t2 WHERE t2.foo=='bar') ON t1.id = t2.id

最好不要重复 (SELECT * FROM t2 WHERE t2.foo=='bar')


2
你可以使用 ON t1.id = t2.id and t2.foo = 'bar' 代替 (SELECT * FROM t2 WHERE t2.foo=='bar')。顺便提一下,在 MySQL 中只需要单个 = - safarov
你也可以使用视图。 - haltabush
3个回答

8
不行,MySQL没有CTE(公共表达式),但如果有的话,你可以使用这个:
WITH tmp AS
  (SELECT * FROM t2 WHERE t2.foo = 'bar')
SELECT * FROM t1
  LEFT JOIN tmp ON t1.id = tmp.id
UNION
SELECT * FROM t1
  RIGHT JOIN tmp ON t1.id = tmp.id

如果 MySQL 有 FULL JOIN (可惜,它也没有!),你可以使用以下语句:
SELECT * FROM t1
  FULL JOIN (SELECT * FROM t2 WHERE t2.foo = 'bar') tmp
    ON t1.id = tmp.id

6
当然可以这样做。
SET @condition := (SELECT * FROM t2 WHERE t2.foo=='bar');
SELECT * FROM t1
LEFT JOIN (@condition) ON t1.id = t2.id
UNION
SELECT * FROM t1
RIGHT JOIN (@condition) ON t1.id = t2.id

5
如果我错了,请纠正我,我认为这不起作用。 - Roy Lee
7
如果子查询返回多行,则无法正常工作。 - Allfarid Morales García
如果子查询引用了主查询,则此方法无效。 - jim smith
1
如果子查询返回多列或多行,则似乎无法工作。不过我使用的是旧版的mysql。 - questionto42
只有当 SELECT ... 返回单个项目(在单行中)时,它才有效。如果返回多列 多行,则无效。MySQL 8.0.27。 - Daniil
谢谢。这正是我在多插入中需要从联接表中获取id值的东西! - scibuff

0

MySQL自8.0版本起拥有函数with。这使得@ypercube的回答是正确的。

因此,现在您可以执行以下操作:

WITH subquery AS
  (SELECT * FROM t2 WHERE t2.foo = 'bar')
SELECT * FROM t1
LEFT JOIN subquery  ON t1.id = t2.id
UNION
SELECT * FROM t1
RIGHT JOIN subquery ON t1.id = t2.id


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接