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