Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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_Sql Server - Fatal编程技术网

SQL中的大型反连接

SQL中的大型反连接,sql,sql-server,Sql,Sql Server,我正在使用一个培训数据库,我试图找到最好的方法来创建一个列表,列出所有用户以及他们没有参加的所有课程。我有两个表一个是150个班的课程主表,一个是175K的注册表。我可以为一个人创建反加入: SELECT * FROM tblCourses C --150 rows Left JOIN tblTraineeCourses TC -- 175K ON C.CourseId = TC.CourseId AND TraineeId = 2283539 WHERE TC.CourseID IS

我正在使用一个培训数据库,我试图找到最好的方法来创建一个列表,列出所有用户以及他们没有参加的所有课程。我有两个表一个是150个班的课程主表,一个是175K的注册表。我可以为一个人创建反加入:

SELECT *
FROM tblCourses  C --150 rows
Left JOIN tblTraineeCourses TC -- 175K
    ON C.CourseId = TC.CourseId AND TraineeId = 2283539
WHERE TC.CourseID IS  NULL
和一个反连接,看看什么课程从来没有采取

SELECT *
FROM tblCourses  C --150 rows
Left JOIN tblTraineeCourses TC 
     ON C.CourseId = TC.CourseId --175K
WHERE TC.CourseID IS  NULL
但是我正在寻找一种方法来生成一个包含每个用户ID和他们没有使用的类的列表


我完全意识到这将生成一个庞大的表,但我需要进行分析

使用
交叉连接
生成所有组合。然后过滤掉现有的:

SELECT T.TraineeId, C.CourseId
FROM tblTrainees t CROSs JOIN
     tblCourses  C LEFT JOIN
     tblTraineeCourses TC 
     ON TC.CourseId = C.CourseId AND
        TC.TraineeId = T.TraineeId
WHERE TC.CourseID IS NULL;
这假设您在
tblTrainees
中有一个受训人员列表。您可以将其替换为:

(SELECt DISTINCT TraineeId FROM tblTraineeCourses
) t

如果您没有这样的表。

我不太喜欢反联接,因为在我看来,
不在
不存在
的直接查询可读性较差。正如Gordon在回答中所说:首先,通过交叉连接获得所有用户和课程的组合。然后我会使用<代码>,除了,我认为这里是最可读的。代码>不在将是我的第二选择(
其中(t.traineeid,c.courseid)不在(…)
不存在
将排在我的第三位,我只会使用反连接,以防我的DBMS的优化器做得很差,并为上述方法提出了一个糟糕的执行计划。在这里问SQL问题时,你应该总是用你正在使用的DBMS标记你的请求。它是哪一个?MySQL?SQL Server?Oracle?…好的Ca这是SQL Server这太完美了!非常感谢!