【问题标题】:SQL: Find all previous records for a subset of IDsSQL:查找 ID 子集的所有先前记录
【发布时间】:2012-03-29 01:32:03
【问题描述】:

我是 SQL 新手,我什至无法启动此查询。

如果学生在 '2012' 有记录,请列出该记录以及他们之前的所有记录。

一个简化的数据集:

作业

STUDENT_ID BOOK_TITLE 学期

001 白鲸 2009 002 尤利西斯 2009 003 哈姆雷特 2009 004 1984 2009 005 哈姆雷特 2009 004 战争与和平 2010 003 审判 2010 004 白鲸 2011 001 -NULL---- 2012 004 -NULL---- 2012

结果应该是在给定学期注册的学生的记录,然后是该学生以前的记录。目标是让用户查看当前注册的学生(书名中的 NULL 值)并确保他们没有分配学生已经阅读的书。

STUDENT_ID BOOK_TITLE 学期 001 -NULL---- 2012 001 白鲸 2009 004 -NULL---- 2012 004 白鲸 2011 004 战争与和平 2010 004 1984 2009

任何指针/起始方向将不胜感激!我试过搞乱'with',多个内部连接,但我没有得到任何地方。我一直在思考 if..then 语法在 SQL 中不起作用?

【问题讨论】:

  • 您使用的是什么数据库引擎(和版本)?
  • 我使用Oracle SQL developer 3.0

标签: sql


【解决方案1】:
SELECT STUDENT_ID, BOOK_TITLE, TERM
  FROM ASSIGNMENTS
  WHERE STUDENT_ID IN
   (SELECT DISTINCT STUDENT_ID FROM ASSIGNMENTS WHERE TERM = 2012)
  ORDER BY STUDENT_ID, TERM DESC

为了首先得出这个答案,我创建了一个符合您预期结果格式的查询。然后我为“只有当前注册的学生”添加了 where 条件。

如果您想对其进行参数化,请使用 @Term 而不是 2012。您也可以使用 WHERE BOOK_TITLE IS NULL 将其从空书名中运行

【讨论】:

  • 谢谢!这完美地工作。在考虑加入时,我完全超越了自己。
【解决方案2】:

我不知道那些 -NULL---- 值是代表实际值还是 NULL 值。假设是后者,这里有一种方法:

SELECT student_id, book_title, term
  FROM assignments
 WHERE student_id IN ( SELECT student_id FROM assignments WHERE book_title IS NULL )

更好的方法可能是根据学生是否注册了当年的学期来检索数据。如何做到这一点取决于您的 RDBMS 和版本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多