(以下查询是对实际问题的极端简化,为了清晰的代码)
我有一个存储过程,其中有一个查询:
SELECT
f1,
f2
FROM
T1
WHERE
T1.id IN (SELECT complex_id FROM t2 WHERE complex='condition')
我想在其他存储过程中重用内部查询(SELECT complex_id FROM t2 WHERE complex='condition')
,但在只有一个地方中维护它的语法。
我如何使用DB对象(SP,触发器等)和没有外部代码(如PHP等)来实现这一目标。
答案 0 :(得分:1)
您应该创建一个视图:http://dev.mysql.com/doc/refman/5.5/en/create-view.html
CREATE VIEW reusable_query AS
SELECT complex_id FROM t2 WHERE complex='condition';
然后你可以:
SELECT * FROM t1 WHERE id IN (SELECT complex_id FROM reusable_query);
您可以使用如下存储过程更进一步:
CREATE FUNCTION isInReusableQuery(param INT) RETURNS BOOL
DELIMITER //
BEGIN
DECLARE cnt INT;
SELECT COUNT(complex_id) INTO cnt FROM reusable_query
WHERE
complex = 'condition'
AND complex_id = param;
RETURN cnt > 0;
END //
DELIMITER ;
允许你做这样的事情:
SELECT * FROM t1 WHERE isInReusableQuery(id);
但是,我可能不会推荐后者。从存储的函数查询视图可能会阻止某些optimisations。