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

这是问题所在,第二个内部连接和相应的 where 语句应该只在某个变量 ( @UseArchive) 为真时发生,如果它为假,我不希望它发生。此外,在TSHSH某些行中可能没有相应的条目S。我尝试将其拆分为 2 个单独的查询,@UseArchive但工作室拒绝编译它,因为INTO #TempA声明说#TempA数据库中已经有一个命名的对象。谁能告诉我修复查询的方法或将查询与INTO #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

将 CASE 语句放在 WHERE 子句中而不是 JOIN 子句中将强制它在 @UseArchive 时像 INNER JOIN 一样,而在不是时则像 LEFT JOIN 一样。

于 2013-04-30T20:27:16.397 回答
0

我会用 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中没有对应的条目怎么办?

如果您只想匹配其中一个连接

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

您可以拆分查询,然后轻松插入临时表。

SELECT * INTO #TempA FROM
(
    SELECT * FROM Q1

    UNION ALL

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