2016-12-21 48 views
1

我已經看到了一些問題和答案,但它們看起來都與我的問題不同。我正試圖插入一個臨時表,其中有一個從真實表中的where子句到另一個臨時表上的id。讓我解釋一下從另一個Temp Table插入到臨時表中拋出錯誤

這是我第一次插入。它創建一個基於參數的臨時表

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',而不是'programs_id'是否重要?數據庫表屬性的一致名稱是必須的。 –

回答

1

您沒有在第二個查詢中處理#programs表。最後一行將不得不改變,以這樣的:

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

這是你必須如何處理臨時表 - 它們不會在當前的腳本變量 - 它們是您斷開之後得到清理實際表。因此,需要將它們作爲表格引入到from子句中,以供每個需要引用它們的查詢使用。

+0

乞求你的赦免,但使用存在(從...選擇top 1 ...(沒有'TOP'的ORDER BY'子句)而不是'exist](從中選擇42)有什麼好處。一個小測試導致所有三個選項的執行計劃相同:'TOP','TOP','ORDER BY'和'42'。 – HABO

+0

@JaazCole我相信這是正確的答案,但我我不確定這是幹什麼的,主要是'Exists'和'Select TOP 1 1'讓我感到困惑 –

+0

@HABO:如果你所檢查的所有東西都是存在的,那麼不需要命令。由於某種原因需要最新記錄的情況下,需要通過以下順序執行命令: @ christopher-clark:TOP在返回以下行數後停止執行,因此,TOP 1停止執行一次1行爲因爲我們沒有返回任何數據,所以選擇常量(1)是可取的'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

不幸的不是!我沒有做好複製它的工作。編輯我的問題 –