【问题标题】:change query to return the rows that don't match更改查询以返回不匹配的行
【发布时间】:2011-07-13 23:40:40
【问题描述】:
SELECT
  T.clinic_code, C.dt, T.schedule_time, T.section_name,
  T.section_content, CS.schedule_event_source_id
FROM Master_Templates T
  INNER JOIN Calendar C
    ON  T.dw = C.dw
    AND T.mo = (C.D - 1) / 7 + 1
    AND C.Y = '2014'
    AND C.M = '3'
    AND T.clinic_code = 'ABC'
  LEFT OUTER JOIN Clinic_Schedule CS
    ON  CS.schedule_date=convert(varchar, C.dt, 121)
    AND CS.clinic_code=T.clinic_code
    AND CS.schedule_time=T.schedule_time
    AND CS.section_name = T.section_name
  WHERE CS.schedule_event_source_id = 2

Clinic_Schedule 包含 1 条记录:

诊所代码 | schedule_date |时间安排 |节名 | schedule_event_source_id ABC | 2014-03-03 |上午 |教师 | 2

Master_Template 包含 168 条记录:

诊所代码 |下一篇 |莫|时间安排 |节名 |部分内容

日历包含用于将 Master_Template 记录与星期几相连的列。

如何更改上面的查询以返回 167 行? IE。 master_template 中的总行数,减去 Clinic_schedule 中的行数。

【问题讨论】:

  • 您至少需要将日历上的加入更改为左加入?

标签: sql-server-2005 tsql select join


【解决方案1】:

这个呢:

SELECT
  T.clinic_code, C.dt, T.schedule_time, T.section_name,
  T.section_content, CS.schedule_event_source_id
FROM Master_Templates T
  INNER JOIN Calendar C
    ON  T.dw = C.dw
    AND T.mo = (C.D - 1) / 7 + 1
    AND C.Y = '2014'
    AND C.M = '3'
    AND T.clinic_code = 'ABC'
  LEFT OUTER JOIN Clinic_Schedule CS
    ON  CS.schedule_date=convert(varchar, C.dt, 121)
    AND CS.clinic_code=T.clinic_code
    AND CS.schedule_time=T.schedule_time
    AND CS.section_name = T.section_name
    AND CS.schedule_event_source_id = 2
  WHERE CS.clinic_code IS NULL

?

【讨论】:

    【解决方案2】:

    要仅返回 T 中在 CS 中不匹配的记录,您可以使用 HAVING,它类似于 WHERE,但 将条件应用于 JOIN 的结果

    SELECT
      T.clinic_code, C.dt, T.schedule_time, T.section_name,
      T.section_content, CS.schedule_event_source_id
    FROM Master_Templates T
    INNER JOIN Calendar C
        ON  T.dw = C.dw
        AND T.mo = (C.D - 1) / 7 + 1
        AND C.Y = '2014'
        AND C.M = '3'
        AND T.clinic_code = 'ABC'
    LEFT OUTER JOIN Clinic_Schedule CS
        ON  CS.schedule_date=convert(varchar, C.dt, 121)
        AND CS.clinic_code=T.clinic_code
        AND CS.schedule_time=T.schedule_time
        AND CS.section_name = T.section_name
        AND CS.schedule_event_source_id = 2
    HAVING CS.clinic_code IS NULL
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-28
      • 1970-01-01
      • 1970-01-01
      • 2013-05-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多