1

次のようなクエリ (ストアド プロシージャからの実行) があります。

SELECT S.name 
INTO #TempA
from tbl_Student S
INNER JOIN tbl_StudentHSHistory TSHSH on TSHSH.STUD_PK=S.STUD_PK
INNER JOIN tbl_CODETAILS C
on C.CODE_DETL_PK=S.GID
WHERE TSHSH.Begin_date < @BegDate

ここに問題があります。2 番目の内部結合と対応する where ステートメントは、特定の変数 ( ) のみが true の場合にのみ発生する必要@UseArchiveがあります。false の場合は発生させたくありません。また、TSHSH特定の行には に対応するエントリがない場合がありますS。に基づいて2つの個別のクエリに分割しようとしましたが、データベースに名前が付けられたオブジェクトが既に存在するというステートメント@UseArchiveのため、スタジオはそれをコンパイルすることを拒否しました。クエリを修正する方法、またはクエリをステートメントで分割する方法を教えてもらえますか?INTO #TempA#TempAINTO #TempA

4

4 に答える 4

2

ここで 2 つの質問をしているようです。

1- SELECT INTO の問題を修正する方法:

SELECT INTO は、ターゲット テーブルが存在しない場合にのみ機能します。テーブルが既に存在する場合は、INSERT INTO...SELECT を使用する必要があります。

2-条件付き結合:

対応する行が存在しない可能性がある場合は、LEFT JOIN を実行する必要があります。これを試して。

SELECT S.name 
FROM tbl_Student S
INNER JOIN tbl_StudentHSHistory TSHSH 
    ON TSHSH.STUD_PK=S.STUD_PK
LEFT JOIN tbl_CODETAILS C 
    ON C.CODE_DETL_PK=S.GID
WHERE TSHSH.Begin_date < @BegDate
    AND CASE WHEN @UseArchive = 1 THEN c.CODE_DETL_PK ELSE 0 END =
        CASE WHEN @UseArchive = 1 THEN S.GID ELSE 0 END

JOIN 句ではなく WHERE 句に CASE ステートメントを配置すると、 @UseArchive の場合は INNER JOIN のように動作し、そうでない場合は LEFT JOIN のように動作します。

于 2013-04-30T20:27:16.397 に答える
0

LEFT JOINに置き換えます

LEFT JOIN tbl_CODETAILS C ON @UseArchive = 1 AND C.CODE_DETL_PK=S.GID

于 2013-04-30T20:26:59.170 に答える
0
SELECT S.name 
INTO #TempA 
from tbl_Student S 
INNER JOIN tbl_StudentHSHistory TSHSH 
   on TSHSH.STUD_PK = S.STUD_PK
INNER JOIN tbl_CODETAILS C
   on C.CODE_DETL_PK = S.GID 
  and @UseArchive = true 
WHERE TSHSH.Begin_date < @BegDate

しかし、この場合に @UseArchive = true を結合に入れることは、
あなたの質問は私にはあまり意味がありません。
では、TSHSH の特定の行が S に対応するエントリを持たない場合はどうなるでしょうか?

結合の 1 つだけを一致させたい場合

SELECT S.name 
INTO #TempA 
from tbl_Student S 
LEFT OUTER JOIN tbl_StudentHSHistory TSHSH 
   on TSHSH.STUD_PK = S.STUD_PK
LEFT OUTER JJOIN tbl_CODETAILS C
   on C.CODE_DETL_PK = S.GID 
  and @UseArchive = true 
WHERE TSHSH.Begin_date < @BegDate 
  and ( TSHSH.STUD_PK is not null or C.CODE_DETL_PK id not null )
于 2013-04-30T20:27:00.033 に答える
0

You can split the queries and then insert into a temp table easily.

SELECT * INTO #TempA FROM
(
    SELECT * FROM Q1

    UNION ALL

    SELECT * FROM Q2
) T
于 2013-04-30T20:29:45.250 に答える