1

出力として複数の行を与えるテーブル値関数があり、出力として2列があります。

今、従業員テーブルのすべての従業員のクエリでこの関数を使用したい

CROSS APPLY を使用していますが、時間がかかり、結果が得られません。

これは私が試したクエリです

select *
from emp A Cross APPLY fnempDiv(A.EmpID)
4

1 に答える 1

0

CROSSAPPLYを使用しています

  • 時間がかかる

残念ながら、これは行ごとの演算子であるため、CROSSAPPLYの性質です。これは、いくつかの従業員行(便利)に最適ですが、説明から、このクエリではそれを避け、APPLYのクエリを外部クエリに拡張する必要があります。単純なINNERJOINで十分です。

  • 結果は出ません。

CROSS APPLYはemp A、行を生成しないレコードをAPPLYから削除します。OUTERAPPLYはemp A記録を保持します。全体で0レコードを取得している場合は、間違った列を渡した可能性があります。たとえばA.EmpID、正しいキーではありません。

関数がこのように定義されている場合(コメントから):

CREATE FUNCTION dbo.fnempDiv(@EmpID)
RETURNS TABLE AS RETURN
 SELECT A.EmpID,D.Name
 FROM empdetail A
 INNER JOIN empdiv D on A.empID=D.ID
 where EXISTS (select * from X)
GO

それはまったく意味がありません。Select * from Xクエリ全体に失敗するか、レコードを入れるなどして不発状態になりXます。入力パラメータ@EmpIDも使用されていません。

一方、次のように宣言されている場合:

CREATE FUNCTION dbo.fnempDiv(@EmpID)
RETURNS TABLE AS RETURN
 SELECT A.EmpID,D.Name
 FROM empdetail A
 INNER JOIN empdiv D on A.empID=D.ID
 where A.EmpID = @EmpID
GO

次に、クエリ全体を書き直すことができます

select E.*, A.emp_ID as EmpDetail_Emp_ID, D.Name
from emp E
INNER JOIN empdetail A ON E.emp_ID=A.EMP_ID
INNER JOIN empdiv D on A.empID=D.ID

さらに、結合A.empID=D.IDは正しく見えません。

于 2012-10-11T18:54:57.327 に答える