比较同一表中的数据-SQL

比较同一表中的数据-SQL,sql,sql-server,Sql,Sql Server,我正在使用一个课程目录表,其中有课程提供时的目录代码和课程代码。我需要做的是确定何时不再提供课程,并将其标记为存档课程 CREATE TABLE [dbo].[COURSECATALOG]( [catalog_code] [char](6) NOT NULL, [course_code] [char](7) NOT NULL, [title] [char](40) NOT NULL, [credits] [decimal](7, 4) NULL, ) ins

我正在使用一个课程目录表,其中有课程提供时的目录代码和课程代码。我需要做的是确定何时不再提供课程,并将其标记为存档课程

CREATE TABLE [dbo].[COURSECATALOG](
    [catalog_code] [char](6) NOT NULL,
    [course_code] [char](7) NOT NULL,
    [title] [char](40) NOT NULL,
    [credits] [decimal](7, 4) NULL,

) 

insert into coursecatalog
values 
('200810', 'BIOL101', 'Biology', '3'),
('200810', 'CHEM201', 'Advanced Chemistry', '3'),
('200810', 'ACCT101', 'Beginning Accounting', '3'),
('201012', 'ACCT101', 'Beginning Accounting', '3'),
('201214', 'ACCT101', 'Beginning Accounting', '3'),
('201214', 'ENGL101', 'English Composition', '3'),
('201416', 'PSYC101', 'Psychology', '3'),
('201618', 'PSYC101', 'Psychology', '3'),
('201618', 'BIOL101', 'Biology', '3'),
('201618', 'CHEM201', 'Advanced Chemistry', '3'),
('201618', 'ENGL101', 'English Composition', '3'),
('201618', 'PSYC101', 'Psychology', '3')
在这种情况下,我需要返回ACCT101-开始会计,因为这不再提供,应该被视为存档课程

CREATE TABLE [dbo].[COURSECATALOG](
    [catalog_code] [char](6) NOT NULL,
    [course_code] [char](7) NOT NULL,
    [title] [char](40) NOT NULL,
    [credits] [decimal](7, 4) NULL,

) 

insert into coursecatalog
values 
('200810', 'BIOL101', 'Biology', '3'),
('200810', 'CHEM201', 'Advanced Chemistry', '3'),
('200810', 'ACCT101', 'Beginning Accounting', '3'),
('201012', 'ACCT101', 'Beginning Accounting', '3'),
('201214', 'ACCT101', 'Beginning Accounting', '3'),
('201214', 'ENGL101', 'English Composition', '3'),
('201416', 'PSYC101', 'Psychology', '3'),
('201618', 'PSYC101', 'Psychology', '3'),
('201618', 'BIOL101', 'Biology', '3'),
('201618', 'CHEM201', 'Advanced Chemistry', '3'),
('201618', 'ENGL101', 'English Composition', '3'),
('201618', 'PSYC101', 'Psychology', '3')
到目前为止,我的代码是:

SELECT
catalog_code, course_code
FROM COURSECATALOG t1
WHERE NOT EXISTS (SELECT 1 
                    FROM COURSECATALOG t2
                   WHERE t2.catalog_code <> t1.catalog_code
                     AND t2.course_code = t1.course_code)
order by 
course_code, catalog_code
但这只返回在一个目录中只提供过一次的课程。我需要弄清楚我如何才能得到可能已经提供了多个目录,但不再提供的课程

任何可以提供的帮助都将不胜感激


谢谢大家!

你想要这样的东西:

SELECT course_code
FROM COURSECATALOG t1
GROUP BY course_code
HAVING MAX(catalog_code) <> '201618';

我认为目录代码是YYYYMM格式的日期

SELECT course_code FROM (
SELECT CONVERT(char, catalog_code,112) AS catalog_code, course_code FROM COURSECATALOG
) AS Q
GROUP BY course_code
HAVING MAX(catalog_code) < '20160101'
例如:

只是好奇而已。您如何知道ACCT101来自旧目录而不是当前目录中的新类?似乎当前目录是目录代码的最大值?一个更规范化的结构将使这变得更容易。添加一个目录表将使这一点不那么模棱两可。我真的希望这些教授能用更好的例子来描述他们给学生的东西。我是根据目录代码来做的。例如,201618是一个涵盖2016-2018年的目录。我不确定目前的课程目录是否真的重要,因为我需要任何不再提供的课程?对。但我想问的是,你们怎么知道什么目录是最新的。并指出数据的模糊性。如果你不需要知道什么是当前的目录或最新的,你就无法知道哪些课程是新的,哪些课程已经退役。谢谢,肖恩。是的,这很有道理。谢谢你,我想这对我会有用的!非常感谢!戈登,谢谢你的帮助。非常感谢!