Sql 缺少表的交叉联接(全选并仅选择或插入缺少的行)

Sql 缺少表的交叉联接(全选并仅选择或插入缺少的行),sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我有两个表,必须根据另一个表在其中一个表中填写缺失值的列表。第一个表包含学生信息,第二个表包含与年级相关的信息、年级和年级描述 表一 ID Name yearWithUs Grade Course Level 1 Jim 2004 4 4 2 Jim 2004 4 1 2 Jim 2003 3

我有两个表,必须根据另一个表在其中一个表中填写缺失值的列表。第一个表包含学生信息,第二个表包含与年级相关的信息、年级和年级描述

表一

ID    Name    yearWithUs       Grade     Course Level
1     Jim     2004             4          4
2     Jim     2004             4          1
2     Jim     2003             3          3
4     Jim     2002             2          3
4     Jim     2002             2          1
3     Jim     2001             1          2
3     Jim     2001             1          1
表二——逻辑是。。高年级的学生可以在学期内的任何时候换到低年级。一次只能下降1级。吉姆在二年级一年级时被分配参加三级课程。他需要先参加2级课程,然后才能参加1级课程。方法吉姆一年级第二级课程的行缺失

表二

ID    Grade      Grade_Desc        Course Level    Course Desc
1     1          First Grade          1              Basic
2     1          First Grade          2              Normal
3     1          First Grade          3              Hard
4     1          First Grade          4              Expert
5     2          Second Grade         1
6     2          Second Grade         2 
7     2          Second Grade         3
8     2          Second Grade         4
.     .             .
.     .             .
.     .             .
ID    Grade      Grade_Desc        Course Level    Possible Move
1     1          First Grade          1              Null
2     1          First Grade          2              1   
3     1          First Grade          3              2 
4     1          First Grade          4              3 
表二的逻辑

ID    Grade      Grade_Desc        Course Level    Possible Move
1     1          First Grade          1              Null
2     1          First Grade          2              1   
3     1          First Grade          3              2 
4     1          First Grade          4              3 
输出一。。。如何使用select语句返回Jim的分数

ID    Name    Grade_Desc            Grade     yerWithUs    Course Level
1     Jim    Fourth Grade           4           2004            4
2     Jim    Fourth Grade           4           2004            3
3     Jim    Fourth Grade           4           2004            2
4     Jim    Fourth Grade           4           2004            1
5     Jim    Third Grade            3           2003            3
6     Jim    Second Grade           2           2002            3
7     Jim    Second Grade           2           2002            2
8     Jim    Second Grade           2           2002            1
9     Jim    First Grade            2           2001            2
10    Jim    First Grade            2           2001            1
输出二..如何仅将缺少的行检索到新的临时表中

ID    Name    Grade_Desc            Grade     yearWithUs   Course Level
2     Jim    Fourth Grade           4           2004            3
3     Jim    Fourth Grade           4           2004            2
7     Jim    Second Grade           2           2002            2
我目前正在使用一个凌乱的游标语句来完成它。该结构看起来非常混乱,很难调试返回错误。我做了很多研究,看到人们使用交叉连接来填充缺失的部分,这看起来非常干净(见下面的示例)。。。我用下面的交叉连接示例尝试了很多不同的方法来编写脚本……显然,我失败了。我在stackoverflow中发现了一个类似的问题。但我无法理解它是如何工作的,为什么不查看数据…我需要帮助了解如何使用交叉连接来重新运行缺少的行?我愿意接受任何其他可能的解决办法

 "SELECT  calendar.Date,
         Category.Cat,
         Score = ISNULL(Scores.Score, 0)
  FROM   Calendar
         CROSS JOIN Catogory
    LEFT JOIN Scores
        ON Scores.Cat = Category.Cat
        AND Scores.Date = Calendar.Date
    WHERE   Calendar.DayOfMonth = 1;"


谢谢

这将产生以下输出:

select distinct name, grade, Grade_Desc 
  from one 
 cross join two 

如果您只需要选择,则:

Select row_number() over(order by (select 1)) as id, * from
(Select distinct name from t1)t1
cross join t2
这里是小提琴

试试这个:

创建#临时 输出一 输出二到输出二(温度表)
你想念汤米吗?什么意思?//2?根据您的输入数据,使您的输出准确无误。第二个表在哪里发挥作用?意味着我希望该列为2..更新我的输出您不想回答其他问题吗?为什么应该是2?逻辑?在输出中。我想有三个字段:Name、Grade\u Desc、Grade。名称和等级在第一个表中。Gtade_Desc在第二个表中。在第一张表格中,吉姆缺1,3,5分,汤米缺2,3,5分,特里缺1,2,3,4分。。。。我想编写一个查询脚本来填充它们。查询中的表名和列名与上面的信息不匹配。返回汤米实际上是吉姆。表2的逻辑是什么?什么是分数?您能否演示如何进行插入,以及如何仅检索缺少的行?非常感谢Giorgi,我用一个我以前一直在思考的更复杂的问题编辑了我的问题。您的sqlfiddle示例让我了解了如何使用交叉连接返回唯一值。但实际上我在寻找更多。如果您能帮我解答更新问题,我将不胜感激。
SELECT *
FROM #temp
SELECT A.* INTO #OutputTwo
FROM #temp A
LEFT JOIN TableOne B
ON A.Grade = B.Grade
AND A.[Course Level] = B.[Course Level]
WHERE A.Grade IS NULL AND A.[Course Level] IS NULL