出力として複数の行を与えるテーブル値関数があり、出力として2列があります。
今、従業員テーブルのすべての従業員のクエリでこの関数を使用したい
CROSS APPLY を使用していますが、時間がかかり、結果が得られません。
これは私が試したクエリです
select *
from emp A Cross APPLY fnempDiv(A.EmpID)
出力として複数の行を与えるテーブル値関数があり、出力として2列があります。
今、従業員テーブルのすべての従業員のクエリでこの関数を使用したい
CROSS APPLY を使用していますが、時間がかかり、結果が得られません。
これは私が試したクエリです
select *
from emp A Cross APPLY fnempDiv(A.EmpID)
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
は正しく見えません。