2013-04-30 99 views
1

我有一個查詢(從存儲過程中發揮),看起來是這樣的:SQL查詢聯接條件

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 

這裏是問題,第二個內部連接和相應的WHERE語句應該只如果只是發生某些變量(@UseArchive)是真的,我不希望它發生,如果它是假的。另外,在TSHSH中,某些行可能在S中沒有對應的條目。我試圖根據@UseArchive將它分成兩個單獨的查詢,但錄音室拒絕編譯,因爲INTO #TempA聲明說數據庫中已經有一個名爲#TempA的對象。任何人都可以告訴我一種方法來修復查詢或用INTO #TempA聲明拆分查詢的方法嗎?

+0

這個查詢在語法上是不正確的。 'INTO'子句必須位於'FROM'子句之前。你能糾正這個嗎? – ErikE 2013-04-30 20:25:08

+0

爲什麼不拆分查詢(就像你寫的)並且使第二個查詢'INSERT INTO #TempA SELECT ....name from ....'? – shahkalpesh 2013-04-30 20:27:13

回答

2

看起來你問2個問題在這裏。

1如何解決SELECT INTO問題:

如果目標表不存在SELECT INTO纔有效。如果表已經存在,則需要使用INSERT INTO ... SELECT。

2-條件JOIN:

你需要做一個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 

把WHERE子句中的CASE語句而不是JOIN子句將迫使它像一個INNER JOIN時@UseArchive和LEFT JOIN時沒有。

0

我會用左手代替它JOIN

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

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 =真在這種情況下加入是相同的
你的問題對我沒有多大意義
那麼如果TSHSH某些行可能在S中沒有對應的條目呢?

如果你只想要的一個聯接匹配

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) 
0

您可以拆分查詢,然後輕鬆插入臨時表。

SELECT * INTO #TempA FROM 
(
    SELECT * FROM Q1 

    UNION ALL 

    SELECT * FROM Q2 
) T