2

条件に基づいてjoinを使用する方法を教えてください。条件に基づいてデータをフィルタリングしているとしましょう。特定のBITタイプのパラメータ値が1の場合、データセットにはもう1つの結合が含まれ、それ以外の場合は前と同じように返されます。これが3つのテーブルA、B、Cです。@boolビットパラメータを持つprocを作成したいと思います。

if @bool=0
then  
select A.* from A 
inner join B on B.id=A.id
and if @bool=1 
then 
select A.* from A
INNER JOIN B on B.id=A.id
inner join C on C.id=A.id 

前もって感謝します。

4

4 に答える 4

1

あなたが持っているものは、マイナーな改造で(確かにMS SQLServerのSPROCで)動作します。

if @bool=0 then  
   select A.* from A 
   inner join B on B.id=A.id
else if @bool=1 then -- Or just else if @boll is limited to [0,1]
   select A.* from A
   INNER JOIN B on B.id=A.id
   inner join C on C.id=A.id 

ただし、注意点として、SQLパラメータスニッフィングは、ダウンする最初のパスのプランをキャッシュします。これは、コード内の他のパスに必ずしも最適ではありません。

また、procにこの「複数の代替クエリ」アプローチを採用する場合は、通常、返される列名とタイプがすべての場合で同一であることを確認することをお勧めします(クエリはA. *であるため問題ありません)。

編集 SQLServerを使用していると仮定すると、別の方法は動的SQLを使用することです。

DECLARE @sql NVARCHAR(MAX)
SET @sql = N'select A.* from A 
             inner join B on B.id=A.id'

IF @bool = 1
    SET @sql = @sql + N' inner join C on C.id=A.id'

sp_executesql @sql

フィルタなどを追加する必要がある場合は、この投稿を参照してください:動的/プログラムでWHERE句をSQLに追加する

于 2012-08-24T10:31:27.337 に答える
0

あなたは組合を使ってそれをします:

SELECT A.* 
FROM A 
    INNER JOIN B on B.id=A.id 
WHERE bool = 0

UNION ALL

SELECT A.* 
FROM A 
    INNER JOIN B on B.id=A.id 
    INNER JOIN C on C.id=A.id 
WHERE bool = 1

boolそれはテーブルAまたはに保存されていると思いますB

于 2012-08-24T10:25:17.647 に答える
0
select A.* from A
inner join B on B.id = A.id
left outer join C on C.id = A.id and @bool = 1
where (@bool = 1 and C.id is not null) or @bool = 0

左の@bool = 1外側の結合をいわば「アクティブ化」し、それをWHERE句に適用することによって、事実上、内側の結合に変換します。その場合@bool = 0、左外側結合はCから何も返さず、WHERE制限を削除します。

于 2012-08-24T10:30:48.390 に答える
0

次のクエリを試してください

SELECT A.*
FROM A
INNER JOIN B on B.id=A.id
INNER JOIN C on C.id=A.id and @bool=1
于 2012-08-24T11:07:33.963 に答える