私のテーブルは(不正確な定義を言い訳してください)。このようなビットを、次のとおりです。フィルタとビュー関数を同じクエリで使用することはできますか?
CREATE TABLE JunctionTable(int Concrete1ID, int Concrete2ID, int someProperty)
CREATE TABLE Concrete1 (int ID, int Prop1, int Prop2)
CREATE TABLE Concrete2 (int ID, int Prop1, int Prop2, int Prop3, int Prop4)
は、具体的な各テーブルへの外部キーがあります。
そしていくつかの機能があります。 1つの関数 - FilterJunction
- 特定の条件を満たすJunctionTable
のものを取得し、Concrete2ID
を与えられたConcrete2
行のプロパティを返す別の関数 - SomeViewofConcrete2
-
CREATE FUNCTION [dbo].FilterJunction() Returns Table AS
BEGIN RETURN (SELECT * FROM JunctionTable WHERE someProperty < 5)
END
CREATE FUNCTION [dbo].SomeViewOfConcrete2(@ID int) RETURNS TABLE
BEGIN
Return (SELECT Prop2, Prop4 FROM Concrete2 WHERE ID = @ID)
END
SomeViewOfConcrete2
は最大で1行のみを返すことが期待されていることに注意してください(と私はセットアップに適切な外部キーをしたとして、この場合には、それは間違いなく、1行を返す必要がありますが。)
だから、最終的にはI 「次のクエリを実行したいとdは:
SELECT ConcreteID1, ConcreteID2, [dbo].SomeViewOfConcrete2(Concrete2ID)
FROM [dbo].FilterJunction()
をしかし、次のエラーを取得:
"Cannot find either column "dbo" or the user-defined function or aggregate "dbo.SomeViewOfConcrete2", or the name is ambiguous."
ConcreteID2
で個別にSomeViewOfConcrete2
を実行しようとすると、そのクエリは完全に正常に動作します。 (例えば、SELECT * FROM [dbo].SomeViewOfConcrete2(1)
私はSQLに関数が正確に1行を返すという意味がないので、期待される結果セットを与える方法がわからないので、ConcreteID1, ConcreteID2, Prop2, Prop4
というエラーメッセージが表示されます。 「tは、私はこの問題を解決することができ
一つの方法は、ただやっていることの良い指標を与える:
SELECT ConcreteID1, ConcreteID2, Prop2, Prop4
FROM [dbo].FilterJunction() F
JOIN CONCRETE2 C
ON F.ConcreteID2 = C.ID
しかし、それはSomeViewOfConcrete2
機能を使用していないので、コードの再利用を奨励していません。 。
は、だから私は謝るが、私の質問は、ビットの2倍である:
- それは、フィルタおよび閲覧機能の両方のコードの再利用を促す方法でクエリを設計することは可能ですか?
- なぜSQLはそれが与えるエラーを投げて何か他のことを言っていないのですか?
ありがとうございます。
ヤワサス!ありがとうございました! – user420667
クロス適用と外側適用の違いを理解してください。 :)あなたがこの仕事をすることができてうれしいです。 –
もっとゴールドナゲット情報。この場合、外部キーが与えられれば、両方が受け入れられます。しかし、私はそれがキーのためでない場合、私はこの場合に外部結合が欲しかったと思います。ありがとう!最初のGoogleの結果は役に立ちました:https://www.mssqltips.com/sqlservertip/1958/sql-server-cross-apply-and-outer-apply/ – user420667