0

(以下查询是对实际查询的极端简化,为了代码清晰)

我有一个存储过程,其中有一个查询:

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、Triggers 等)而不使用外部代码(如 PHP 等)来实现这一点。

4

1 回答 1

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);

不过,我可能不会推荐后者。从存储的函数中查询视图可能会阻止一些优化

于 2012-11-01T19:54:18.170 回答