2013-04-30 5 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 

Вот вопрос, то второе внутреннее соединение и соответствующее где утверждение должно произойти только тогда, когда только определенная переменная (@UseArchive) истинна, я не хочу, чтобы это произошло, если она ложна. Кроме того, в TSHSH некоторые строки могут не иметь соответствующих записей в S. Я попытался разделить его на 2 отдельных запроса на основе @UseArchive, но студия отказывается компилировать это из-за заявления INTO #TempA, в котором говорится, что в базе уже есть объект с именем #TempA. Может ли кто-нибудь сказать мне способ исправить запрос или способ разделить запросы с оператором INTO #TempA?

+0

Этот запрос не является синтаксически правильным. Предложение 'INTO' должно появиться перед предложением' FROM'. Не могли бы вы исправить это? – ErikE

+0

Почему бы не разделить запрос (как вы писали) и сделать второй запрос 'INSERT INTO #TEMPA SELECT S.name from ....'? – shahkalpesh

ответ

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 

Ввод оператора CASE, в предложении WHERE и не Соединить положение заставит его действовать как внутреннее соединение, когда @UseArchive и LEFT JOIN, когда нет.

0

Я бы заменить его LEFT JOIN

LEFT JOIN tbl_CODETAILS C ON @UseArchive = 1 И 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 
Смежные вопросы