全外连接多次连接每个记录

时间:2014-06-09 21:18:17

标签: sql sql-server tsql

以下查询:

select 

       cu.course_id      as 'bb_course_id',
       cu.user_id        as 'bb_user_id',
       cu.role           as 'bb_role',
       cu.available_ind  as 'bb_available_ind',
       CASE cu.row_status WHEN 0 THEN 'ENABLED' ELSE 'DISABLED' END AS 'bb_row_status',
       eff.course_id     as 'registrar_course_id',
       eff.user_id       as 'registrar_user_id',
       eff.role          as 'registrar_role',
       eff.available_ind as 'registrar_available_ind',
       CASE eff.row_status WHEN 'DISABLE' THEN 'DISABLED' END as 'registrar_row_status'

into enrollments_comparison_temp
from narrowed_users_enrollments cu 
full outer join enrollments_feed_file  eff on cu.course_id = eff.course_id

快速背景:我从复制表中获取数据,并根据某些条件将其选择为narrowed_users_enrollments。在脚本中,我使用文本供稿文件,使用注册数据,并将其插入enrollments_feed_file。目的是将最新的注册数据与数据库中已有的注册进行比较。

然而,问题是加入这些表会产生大约160,000行,而我实际上只期望大约22,000行。进行此比较的重点是,我可以在连接的任一侧查找无效值。例如,如果右侧的表包含null,则禁用注册记录。如果左侧的表格包含空值,则添加此学生的注册。

我知道它有点不对,因为我没有使用PK或FK。这是在表中选择的内容:

此处的屏幕截图显示了左侧注册表中的select *和右侧的Feed文件。

http://i.imgur.com/0ZPZ9HS.png

这是一个屏幕截图,显示了全外连接中新创建的表格。

http://i.imgur.com/89ssAkS.png

正如您所看到的那样,即使只有一个匹配的注册(匹配的jmartinez12列),在左侧为相同的记录创建了4个额外的行,用于右侧的注册。我想要获得的是5行,第一行是屏幕截图中的情况(匹配预先存在的注册和在feed文件中注册),但是,接下来的4行是{ {1}}列应为NULL bb_*

我在这里忽略了一些简单的事情吗?我尝试了一个select distinct,并且我添加了一个where子句,指定course_ids何时相等但是确保我不会获得我需要的空行。我也加入了user_id上的表格,但结果仍然相同。

2 个答案:

答案 0 :(得分:0)

一个快速建议是添加DISTNCT子句。如果您设置的记录是完整的重复项,可能会将其降低到您期望的范围。

答案 1 :(得分:0)

修复还要加入:

ON cu.course_id = eff.course_id AND cu.user_id = eff.user_id