Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从另一个临时表插入临时表会引发错误_Sql_Tsql_Temp Tables - Fatal编程技术网

Sql 从另一个临时表插入临时表会引发错误

Sql 从另一个临时表插入临时表会引发错误,sql,tsql,temp-tables,Sql,Tsql,Temp Tables,我已经看到了一些关于这个问题的问题和答案,但它们似乎都与我的问题不同。我试图将where子句从一个实表插入到另一个临时表的id中。让我解释一下 这是我的第一个插页。它根据参数创建临时表 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 W

我已经看到了一些关于这个问题的问题和答案,但它们似乎都与我的问题不同。我试图将where子句从一个实表插入到另一个临时表的id中。让我解释一下

这是我的第一个插页。它根据参数创建临时表

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
这将返回一个包含程序平面列表的表。课程在学校一级提供,并与相关的州立大学课程稍作修改

然后我需要一个从program_student表中获取该课程的所有学生的列表

这将满足我的需要,让所有在该学年参加过学校提供的任何课程的学生

完全错误是

无法绑定多部分标识符“programs.program_id”


您在定义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

您没有在第二个查询中寻址programs表。最后一行必须更改为以下内容:

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

这就是您必须处理临时表的方式-它们不会成为当前脚本中的变量-它们是实际的表,在您断开连接后会被清除。因此,它们需要作为表引入——在from子句中,针对每个需要引用它们的查询。

在一个地方它说的是proram\u Id,而不是programs\u Id,这有关系吗?数据库表属性的名称必须一致。请原谅,使用exists select top 1的好处是什么。。。如果顶部没有ORDER BY子句而不是exists,请从…中选择42。。。?一个小测试为所有三个选项生成了相同的执行计划:TOP、TOP with ORDER BY和42。@JaazCole我确信这是正确的答案,但我不确定这是做什么的。主要是“存在”和“选择前1”让人困惑me@HABO:如果您只检查是否存在,则无需通过下订单。如果这是一个交叉申请的情况,而我出于某种原因想要最新的记录,那就必须在下订单之前@克里斯托弗·克拉克:返回以下行数后,TOP停止执行。因此,一旦返回一行,TOP 1就会停止执行。因为我们不返回任何数据,所以最好选择常数1。因此,EXISTS SELECT TOP 1 FROM…@JaazCole EXISTS告诉查询优化器忽略列列表,即42或*被同等忽略,并在找到任何行时终止。TOP在这种情况下没有任何好处。@HABO是的,我显然忘记了这一点。谢谢你的提醒。不幸的是没有!我没有把它复制好。编辑我的问题
WHERE EXISTS (SELECT TOP 1 1 FROM #Programs WHERE #Programs.programs_id = ps.program_id)