我有一个返回3条记录的SQL
select emp_no from employees where dept_no='S3407'
结果
1089
2092
1999
我需要在函数和函数中使用上面的SQL应该返回所有三个值。 我想在另一个sql语句中使用此函数,如下所示
select * from emp_history where emp_no in ('1089','2092','1999');
在上面的sql中,我想使用该函数而不是硬编码的员工编号。
实现这一目标的最佳方法是什么?
由于查询非常复杂,因为我上面提到的只是查询的一个示例,因为无法在此处粘贴完整查询。所以我需要使用一个函数来实现这一点。
任何帮助都非常值得赞赏。
问候
答案 0 :(得分:1)
您可以使用视图:
create view vw_MyView
as
select emp_no
from employees
where dept_no = 'S3407'
您可以在第二个查询中使用该视图:
select * from emp_history where emp_no in (select emp_no from vw_MyView);
答案 1 :(得分:1)
我建议你考虑Andomar的建议,理由如下: 1.视图允许提供足够的封装级别 2. CBO对视图的工作几乎完美,因此根据记录数量,您的查询或多或少可以预测。
一旦用函数替换视图,当CBO无法估计函数的基数时,您将面临这种情况,因此您要么提交完整扫描或实现一种包,以便计算函数的基数。 / p>
所以+`1给Andomar
当然,您可以使用流水线功能并将查询重写为
select * from emp_history where emp_no in (select * from table(your pipelined function))
但正如我之前解释的那样,这不是最好的方式
您可以在链接http://www.oracle-base.com/articles/misc/pipelined-table-functions.php
中找到关于流水线功能的完美文章(我的意见)答案 2 :(得分:0)
您可以在不使用函数的情况下在此处创建子查询。
SELECT *
FROM emp_history
WHERE emp_no IN
(
SELECT emp_no
FROM employees
WHERE dept_no = 'S3407'
);
答案 3 :(得分:0)
您可以尝试使用以下方法。
CREATE FUNCTION GetEmpNos
(
@dept_no varchar(10)
)
RETURNS TABLE
AS
RETURN
(
SELECT emp_no from employees Where dept_no = @dept_no
)
GO
并使用此功能,如下所示。
select * from emp_history where emp_no in (select * from dbo.GetEmpNos('S3407'));
对于oracle 10g,请尝试使用以下代码。
CREATE TYPE my_emp_type_coll IS TABLE OF my_emp_type;
/
CREATE OR REPLACE FUNCTION get_emp_no (p_dept_no IN VARCHAR(10))
RETURN my_emp_type_coll PIPELINED IS
BEGIN
FOR emp IN (SELECT * FROM employees WHERE dept_no=p_dept_no) LOOP
PIPE ROW(my_emp_type(emp.emp_no));
END LOOP;
RETURN;
END;
/
SELECT * FROM emp_history WHERE emp_no IN (SELECT * FROM TABLE(get_emp_no('S3407')));