将mysql子查询存储在变量中

Sid*_*Bob 5 mysql

是否可以以某种方式存储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
Run Code Online (Sandbox Code Playgroud)

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

Muh*_*eel 5

当然这样做

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
Run Code Online (Sandbox Code Playgroud)

  • 如果我错了,请纠正我,我认为这行不通。 (3认同)
  • 如果子查询返回多于一行,则不起作用。 (3认同)

ype*_*eᵀᴹ 5

不,你不能。如果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
Run Code Online (Sandbox Code Playgroud)

如果MySQL有FULL JOIN(可惜,那也没有!),您可以使用以下代码:

SELECT * FROM t1
  FULL JOIN (SELECT * FROM t2 WHERE t2.foo = 'bar') tmp
    ON t1.id = tmp.id
Run Code Online (Sandbox Code Playgroud)