2016-12-21 6 views
1

Я видел несколько вопросов и ответов для этого, но все они выглядят иначе, чем моя проблема. Я пытаюсь вставить в временную таблицу с предложением where из реальной таблицы в id в другой таблице temp. Позвольте мне объяснитьВставить в таблицу темпа из другой таблицы Temp throws error

Вот моя первая вставка. Он создает временную таблицу на основе параметров

Insert Into #programs (programs_id, state_program_ID, org_no, bldg_no) 
    Select programs_ID, state_program_ID, org_no, bldg_no 
    From programs as p 
    Where p.org_no = @org_no 
     And p.bldg_no = @bldg_no 
     And p.school_yr = @school_year 

Это возвращает таблицу с плоским списком программ. Программы предлагаются на уровне школы и слегка изменены из соответствующих state_program.

Затем мне нужен список всех учащихся, которые взяли программу из таблицы program_student.

Insert Into #programStudent (programs_id , ss_id, status_id) 
    Select ps.programs_id, ps.ss_id, ps.status_id 
    From program_student as ps 
    Where ps.programs_id = #programs.program_id 
     --'#programs.program_id' throws error 

Это удовлетворит мою потребность в том, чтобы все учащиеся, принявшие любую из программ, предлагаемых школой в этом учебном году.

Полная ошибка

Мульти-часть идентификатора '# programs.program_id' не может быть связано.

+0

Имеет ли значение, что в одном месте он говорит 'proram_Id', а не' program_id'? Согласованные имена атрибутов таблицы базы данных являются обязательными. –

ответ

1

Вы не обращаетесь к таблице #programs во втором запросе. что последняя строка будет иметь, чтобы изменить что-то вроде этого:

WHERE EXISTS (SELECT TOP 1 1 FROM #Programs WHERE #Programs.programs_id = ps.program_id) 

Это, как вы должны решать временные таблицы - они не становятся переменными в текущем сценарии - они реальные таблицы, которые очищаются после отключения. Таким образом, они должны вводиться в виде таблиц - в условии from, для каждого запроса, который должен ссылаться на них.

+0

Прошу прощения, но в чем польза от использования 'exists (выберите top 1 1 from ...' (без предложения ORDER BY для 'TOP') вместо' exists (выберите 42 из. Маленький тест привел к тому же плану выполнения для всех трех вариантов: 'TOP',' TOP' с 'ORDER BY' и' 42'. – HABO

+0

@JaazCole Я уверен, что это правильный ответ, но я «Не знаю, что это делает. В основном« Exists »и« Select TOP 1 1 »меня смущают –

+0

@HABO: нет необходимости в заказе, если все, что вы проверяете, есть существование. ситуация с крестом применима, когда мне нужна последняя запись по какой-то причине, что потребовало бы порядка. @ christopher-clark: выполнение TOP-стопов после того, как возвращается следующее количество строк, таким образом, TOP 1 прекращает выполнение, как только 1 строка Если мы не возвращаем какие-либо данные, предпочтительнее выбрать константу (1). hus, 'EXISTS (SELECT TOP 1 1 FROM ...' –

0

Вы имели опечатку при определении #programs таблицы - вы назвали Колонный programs_id и не program_id. Просто исправьте это, и все должно быть в порядке:

Insert Into #programs (program_id, state_program_ID, org_no, bldg_no) 
-- "s" removed Here ---------^ 
    Select programs_ID, state_program_ID, org_no, bldg_no 
    From programs as p 
    Where p.org_no = @org_no 
     And p.bldg_no = @bldg_no 
     And p.school_yr = @school_year 
+0

К сожалению, нет! Я не очень хорошо его копировал. Отредактировал мой вопрос –