2

这个问题可能已经被问过了,但我似乎找不到我的答案,所以这里是:

我从JOIN两个表中选择 10 个字段。结果是大约 1186 行数据。ClassId在这些行中,除了一个唯一字段 ( )之外,有几行在所有意图和目的上都是重复的。我需要这个领域,但它让我无法获得以及我定义为“独特”的东西。例如,仅查询CodeTeacherDescripTerm会产生 1120 条记录。

我希望运行相同的查询,但添加一个WHERE带有子查询的子句,该子查询搜索一组更窄的字段,准确地说是上面列出的三个字段,排除了导致我的“重复”的唯一字段。当然,我收到的错误如下:

“当不使用 EXISTS 引入子查询时,选择列表中只能指定一个表达式。”

当我尝试使用EXISTS而不是ClassScedule.Code IN我仍然得到了完整的 1186。

这是我的查询:

 SELECT DISTINCT ClassId
      ,Code
      ,Section
      ,Course
      ,Students
      ,ClassStart
      ,TeacherDescrip
      ,AdTeacherID
      ,email
      ,Term
      ,Campus
  FROM ClassScedule
  JOIN staff ON staff.StaffID = ClassScedule.AdTeacherID
  WHERE ClassStart BETWEEN '2012-03-01' AND '2012-03-30'
        AND ClassScedule.Code IN 
              (SELECT DISTINCT ClassScedule.Code, TeacherDescrip, Termcode 
               FROM ClassScedule 
              WHERE ClassStart BETWEEN '2012-03-01' AND '2012-03-30')
        AND TeacherDescrip IS NOT NULL 
  ORDER BY Instructor
4

4 回答 4

1

如果您使用的是 SQL Server 2005 或更高版本,您可以为每个不同的(代码、教师描述、术语)选择一个结果,如下所示:

SELECT TOP (1) WITH TIES
       ClassId
      ,Code
      ,Section
      ,Course
      ,Students
      ,ClassStart
      ,TeacherDescrip
      ,AdTeacherID
      ,email
      ,Term
      ,Campus
  FROM ClassScedule
  JOIN staff ON staff.StaffID = ClassScedule.AdTeacherID
  WHERE ClassStart BETWEEN '2012-03-01' AND '2012-03-30'
  AND TeacherDescrip IS NOT NULL 
  ORDER BY ROW_NUMBER() OVER (
    PARTITION BY Code, TeacherDescrip, Term
    ORDER BY ClassID DESC
  )

在重复的(代码、教师描述、学期)值中,此查询为您提供具有最小 ClassID 的结果。如果您想要最大,请删除 DESC。

于 2012-04-04T16:31:43.143 回答
0

好吧,肮脏的解决方案是:

 SELECT max(ClassId),
      ,Code ,Section ,Course ,Students ,ClassStart ,TeacherDescrip ,AdTeacherID
      ,email ,Term ,Campus
  FROM ClassScedule
  JOIN staff ON staff.StaffID = ClassScedule.AdTeacherID
  WHERE ClassStart BETWEEN '2012-03-01' AND '2012-03-30'
    AND TeacherDescrip IS NOT NULL 
  GROUP BY Code ,Section ,Course ,Students ,ClassStart ,TeacherDescrip
   ,AdTeacherID ,email ,Term ,Campus
  ORDER BY Instructor

这将为您提供“重复”值的最大 ClassId。看起来子查询实际上正在获取这些日期之间的所有类代码,但外部查询已经获取了所有这些类代码,因此没有必要。

于 2012-04-04T16:15:59.823 回答
0

首先,您不能在子查询中返回多个列来在 WHERE 子句中进行比较

              ClassScedule.Code IN 
              (SELECT DISTINCT ClassScedule.Code, TeacherDescrip, Termcode 
               FROM ClassScedule 
              WHERE ClassStart BETWEEN '2012-03-01' AND '2012-03-30')

无论如何都对你没有帮助,因为你已经从你的主要 WHERE 中得到了它clause

由于该表具有多个ClassId您定义为“唯一”的内容,因此不返回多行的唯一方法是ClassIdSELECT. 否则 SQL Server 无法知道ClassId您想要哪个。

如果您只想要一个ClassId,您可以在其他所有内容上使用MINorMAX ClassId和 group。

于 2012-04-04T16:16:24.993 回答
0

通过以下方式将其变成一个大组:

SELECT DISTINCT
      min(ClassId) ClassId
     ,Code
     ,Section
     ,Course 
     ,Students
     ,ClassStart
     ,TeacherDescrip
     ,AdTeacherID
     ,email
     ,Term
     ,Campus
FROM ClassScedule
JOIN staff ON staff.StaffID = ClassScedule.AdTeacherID
WHERE ClassStart BETWEEN '2012-03-01' AND '2012-03-30'
  AND TeacherDescrip IS NOT NULL
GROUP BY
      Code
     ,Section
     ,Course 
     ,Students
     ,ClassStart
     ,TeacherDescrip
     ,AdTeacherID
     ,email
     ,Term
     ,Campus
ORDER BY Instructor

不需要子查询。这些列可能需要稍微调整一下,如果没有表别名,就不可能知道它们来自哪个表。我选择了“第一个”ClassId,但您可以使用 max() 拉出“最后一个”。

于 2012-04-04T16:18:54.600 回答