【问题标题】:Select records that are not associated with the other record选择不与其他记录关联的记录
【发布时间】:2015-06-01 11:29:43
【问题描述】:

嗨,我有 3 个表 Modules,Students 和连接表(多对多)StudentModules。我想选择学生尚未注册的所有模块。当学生注册时,信息存储在StudentModules 表。基本上我想从Modules 表中选择与StudentModules 表中的学号无关的所有模块。

我试过下面的代码

SELECT Modules.*, Students.*
FROM            ((StudentsModules INNER JOIN
                     Modules ON StudentsModules.ModuleCode = Modules.ModuleCode) INNER JOIN
                     Students ON StudentsModules.StudentNo = Students.StudentNo)
                     Where StudentNo = 48377767 AND WHERE ModuleCode NOT IN (SELECT ModuleCode FROM StudentsModules)

【问题讨论】:

    标签: mysql sql vb.net ado.net oledb


    【解决方案1】:

    选择学生尚未注册的所有模块的一种可能方法,假设在此示例中学生编号为48377767

    SELECT m.*
    FROM Modules m
         LEFT JOIN StudentsModules sm ON sm.ModuleCode = m.ModuleCode 
                                         AND sm.StudentNo = 48377767
    WHERE sm.ModuleCode IS NULL
    

    [SQL Fiddle]

    更新:

    没有JOIN 的不同方法:

    SELECT m.*
    FROM Modules m
    WHERE m.ModuleCode NOT IN
                       (
                          SELECT ModuleCode
                          FROM StudentsModules
                          WHERE StudentNo = 48377767
                        )
    

    【讨论】:

    • 返回空结果集。
    • 查询在MySql 中有效,我在Visual Basic 中得到{System.Data.OleDb.OleDbException} {"JOIN expression not supported."}
    • @Phuti 在不使用JOIN 的情况下发布了另一个可能的解决方案,试试看
    • 您的所有查询都在MySql 和我的Query Builder 中工作,但在我的代码中出现错误,也许我遗漏了一些东西。谢谢你的帮助。
    • 我的代码中有一个错误,我正在访问不在结果集中的列。
    【解决方案2】:

    你已经接近了,你最后忘记了一张支票!

    编辑此部分:

    NOT IN (SELECT ModuleCode FROM StudentsModules where StudentNo=48377767)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-23
      • 1970-01-01
      • 2019-11-03
      • 1970-01-01
      相关资源
      最近更新 更多