【问题标题】:TSQL Selection Criteria For Join - Left Join连接的 TSQL 选择标准 - 左连接
【发布时间】:2015-12-17 21:16:08
【问题描述】:
Select  *
From    cacheAttendanceMeasures cam 
        Left Join dmcUserSelectedAttendanceMeasures usam on usam.attMeasureID = cam.attMeasureID
          And usam.personID = @personID
          And usam.pageID = @pageID

我了解上述查询将返回 cacheAttendanceMeasures 中的所有行以及 dmcUserSelectedAttendanceMeasures 和 dmcUserSelectedStudentMonths 中条件匹配的所有行。我真正想做的是:

  1. 如果左连接不匹配,则返回 cacheAttendanceMeasures 中的所有行 -- 那么它当前正在做什么
  2. 但是,如果左连接确实匹配,则仅返回 cacheAttendanceMeasures 中匹配的行

这可能吗?

编辑: 我将上面的查询简化为只包含一个 Left Join 表,我不想让问题过于复杂。

以下是我希望根据表之间没有匹配项与是否存在匹配项返回的数据集示例:

凸轮表
cID   attMeasureID   值
1            1                   530
2             2                   95.7
3            3                   380
4            4                  742.57
5            5                   200

usam 表
uID  personID  pageID  attMeasureID
1       877450       31           1
2       923450       28           2
3       877450       31           3
4       369842       28           4
5       212193       25           1

@personID = 577597 & @pageID = 20 时返回的数据集:
CID  attMeasureID  值  uID  pageID  attMeasureID
1                 1            530   null     nul            null
2                 2            95.7  null     null           null
3                  3            380   null     null           null
4                 4         742.57 null     null           null
5                  5           200    null     null           null

@personID = 877450 & @pageID = 31 时返回的数据集:
CID  attMeasureID  值  uID  personID  pageID  attMeasureID
1            1                530      1      877450      31          1
3            3                380      3      877450      31          3

【问题讨论】:

  • 也许你的意思是这样的:where dmcUserSelectedAttendanceMeasures is not null 例如,我不知道你是否希望两个左连接表都为空,我只是用这个例子来做一个......但它看起来像 1和 2 是互斥的。提供所有三个表的一些示例预期输出,以帮助阐明您的目标。假设 T1、T2、T3 表名:如果 T1 和 T2 中的记录而不是 T3 中的记录...显示什么?如果 T1 和 T3 中的记录显示什么?如果 T1、T2、T3 中的记录显示什么,如果仅在 T1 中显示什么?也许您只需要在 personID 和 pageID 上加入 ussm 并在第一个左侧进行限制
  • 感谢您的快速回复!我正准备下班,但明天会提供更多细节……但希望这会有所帮助:此查询会将数据提供给 html 报告。正在联接的两个表存储用户指定的过滤器。例如,有六种出勤率:出勤率、注册总天数、缺勤总天数等。如果用户只想查看出勤率,他们可以选择这就是我想要返回的全部内容。如果他们没有选择过滤器,那么我想返回所有内容。

标签: sql-server tsql join


【解决方案1】:

我不太确定你想要什么结果...

一开始我以为可能是这样的..

SELECT  *
FROM cacheAttendanceMeasures cam 
LEFT JOIN dmcUserSelectedAttendanceMeasures usam 
   on usam.attMeasureID = cam.attMeasureID
  And usam.personID = @personID
  And usam.pageID = @pageID
LEFT JOIN dmcUserSelectedStudentMonths ussm 
   on ussm.monthSeq = cam.pupilMonth
  And ussm.personID = USAM.PersonID
  And ussm.pageID = USAM.PageId

-- 这个 where 子句看起来很傻,因为它否定了左连接;使它们成为内部连接并违反#1关于你所追求的东西。所以我不认为那是你所追求的......

WHERE ussm.personID is not null
and usam.personID is not null

所以你是说规则 2...如果单个记录不为空,则只返回左连接表和第一个表中存在的记录?

所以给定:

T1  T2   T3
X   X    X
Y   NULL Y
Z   Y    NULL
T   NULL NULL

我想你只想记录 X 但鉴于 所以给定:

T1  T2   T3
X   X    NULL
Y   NULL Y
Z   Y    NULL
T   NULL NULL

我想你会想要 X、Y Z 和 T...需要更好的说明。

【讨论】:

    猜你喜欢
    • 2012-10-31
    • 2017-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多