2016-06-23 8 views
2

私のテーブルは(不正確な定義を言い訳してください)。このようなビットを、次のとおりです。フィルタとビュー関数を同じクエリで使用することはできますか?

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倍である:

  1. それは、フィルタおよび閲覧機能の両方のコードの再利用を促す方法でクエリを設計することは可能ですか?
  2. なぜSQLはそれが与えるエラーを投げて何か他のことを言っていないのですか?

ありがとうございます。

答えて

4

これは、テーブル値関数が任意の数の行を返すように設計されているためです。このようなテーブルを列として押し込むことはできません。ただし、ここではかなり効果的にAPPLYを使用することができます。

SELECT ConcreteID1 
    , ConcreteID2 
    , svc.Prop2 --or whatever columns from that function 
    , svc.Prop4 
FROM [dbo].FilterJunction() fj 
cross apply [dbo].SomeViewOfConcrete2(fj.Concrete2ID) svc 
+0

ヤワサス!ありがとうございました! – user420667

+1

クロス適用と外側適用の違いを理解してください。 :)あなたがこの仕事をすることができてうれしいです。 –

+0

もっとゴールドナゲット情報。この場合、外部キーが与えられれば、両方が受け入れられます。しかし、私はそれがキーのためでない場合、私はこの場合に外部結合が欲しかったと思います。ありがとう!最初のGoogleの結果は役に立ちました:https://www.mssqltips.com/sqlservertip/1958/sql-server-cross-apply-and-outer-apply/ – user420667

関連する問題