1

3つのレコードを返すSQLがあります

select emp_no from employees where dept_no='S3407'

結果

1089
2092
1999 

関数で上記の SQL を使用する必要があり、関数は 3 つの値すべてを返す必要があります。次のような別のSQLステートメントでこの関数を使用したいと思います

select * from emp_history where emp_no in ('1089','2092','1999');

上記の SQL では、ハードコードされた従業員番号の代わりに関数を使用したいと考えています。

これを達成するための最良の方法は何ですか?

完全なクエリをここに貼り付けることはできないため、上記で述べたのはクエリのサンプルにすぎないため、クエリは非常に複雑です。したがって、これを実現するには関数を使用する必要があります。

どんな助けも非常に高く評価されます。

よろしく

4

4 に答える 4

1

次の理由により、Andomar の提案を検討することをお勧めします。 1. ビューは十分なレベルのカプセル化を提供できる 2. CBO はビューでほぼ完璧に機能するため、クエリはレコード数に応じて多かれ少なかれ予測どおりに機能します。

ビューを関数で置き換えると、CBO が関数のカーディナリティを推定できない場合に直面するため、関数のカーディナリティを計算するには、フル スキャンを送信するか、パッケージの種類を実装する必要があります。

アンドマーに +`1

確かに、パイプライン化された関数を使用して、クエリを次のように書き直すことができます。

 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で、パイプライン関数に関する完全な記事を (私の意見では) 見つけることができます。

于 2012-09-17T07:17:57.247 に答える
1

ビューを使用できます:

create view vw_MyView 
as
select  emp_no 
from    employees 
where   dept_no = 'S3407'

そして、そのビューを 2 番目のクエリで使用できます。

select * from emp_history where emp_no in (select emp_no from vw_MyView);
于 2012-09-17T07:11:28.263 に答える
0

関数を使用せずに、これに対してサブクエリを作成できます。

SELECT *
FROM   emp_history
WHERE  emp_no IN 
        (
            SELECT emp_no
            FROM employees
            WHERE dept_no = 'S3407'
        );
于 2012-09-17T07:05:52.010 に答える
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'))); 
于 2012-09-17T07:36:51.360 に答える