如何在SQL连接查询中排除SMCourse表的remarks列
问题解答
为什么EXCEPT不生效
EXCEPT是行级操作符,作用是对比两个查询的结果集,返回存在于第一个查询、但不存在于第二个查询的整行数据,不支持列级别的筛选排除,所以没法用它来去掉单个列。
最简单的实现方案
不要使用SELECT *通配符查询所有列,改为显式指定需要返回的字段即可,这也是所有SQL数据库通用的标准写法:
- 除
SMCourse表之外的其他关联表,如果需要返回全部字段,可以直接用表别名.*简写,不用逐列罗列 - 对于
SMCourse表,只需要列出除remarks之外你实际需要用到的字段即可
修改后的示例SQL如下:
select coll.*, colldtl.*, challan.*, period.*, -- 下方按需列出course表除remarks外的所需字段即可 course.Id, course.CourseName, course.CourseCode, course.Credit, section.*, std.* from SMFeecollectionhdr coll join SMFeecollectiondtl colldtl on colldtl.transid = coll.id join SMFeechallanhdr challan on challan.Id = colldtl.challanid join SMPerioddtl period on period.Id = challan.perioddtlid join SMCourse course on course.Id = challan.courseid join SMSection section on section.Id = challan.sectionid join SMStudentinfo std on std.Id = coll.studentid where coll.entityid = 5030
注:部分数据库(比如SQL Server、PostgreSQL)支持通过动态SQL自动生成列名,省去手动罗列字段的步骤,但这种写法依赖数据库特定语法,可移植性差,日常开发中优先选择上述显式指定列的写法,兼容性最好,也能避免表结构变动时返回意外字段。
内容的提问来源于stack exchange,提问作者Syed Raza Abbas SRA
相关产品推荐
相关产品推荐

