带有WHERE子句的LEFT OUTER JOIN

Wes*_*ley 21 sql-server join sql-server-ce

我有两张桌子.indRailType包含与我在其他表中使用的ID值配对的名称列表,以指示导轨类型.WO_BreakerRail包含日期列和轨道代码列,对应于相同的代码indRailType和其他一些数据.WO_BreakerRail对于每个日期,每种铁路类型的任何活动都有一排.所以我可以有3行日期3/19/2010,每行表示不同的轨道代码,以及发生了什么.

当我使用以下内容时LEFT OUTER JOIN,我得到一个包含所有类型轨道的表,在19行中没有任何事情发生的行中有空值.现在,这只是起作用,因为我现在只有一个日期表示在我的WO_BreakerRail表中,即19日.当我添加更多具有不同日期的行时,事情会变得混乱.

这是我的SQL语句,它现在给出了我想要的结果:

SELECT WO_BreakerRail.ID, indRailType.RailType, WO_BreakerRail.CreatedPieces, 
    WO_BreakerRail.OutsideSource, WO_BreakerRail.Charged, 
    WO_BreakerRail.Rejected, WO_BreakerRail.RejectedToCrop
FROM indRailType
LEFT OUTER JOIN WO_BreakerRail 
    ON indRailType.RailCode = WO_BreakerRail.RailCode
Run Code Online (Sandbox Code Playgroud)

现在,当我添加一个WHERE WO_BreakerRail.Date = @Date子句时,我会丢失所有JOIN没有发生的行.我不希望这样.从阅读起,听起来像是OUTER JOIN我想要的全部,但SQL Server Compact Edition不支持FULL OUTER JOINs.有没有办法解决这个问题,还是我正在寻找其他的东西?

Phi*_*rie 40

尝试:

SELECT WO_BreakerRail.ID, indRailType.RailType, WO_BreakerRail.CreatedPieces, 
    WO_BreakerRail.OutsideSource, WO_BreakerRail.Charged,
    WO_BreakerRail.Rejected, WO_BreakerRail.RejectedToCrop
FROM indRailType
LEFT OUTER JOIN WO_BreakerRail ON indRailType.RailCode = WO_BreakerRail.RailCode 
            AND WO_BreakerRail.Date = @Date
Run Code Online (Sandbox Code Playgroud)

因此添加AND WO_BreakerRail.Date = @Date到连接上


Cha*_*ana 15

谓词条件需要On在join 的子句中,而不是在where子句中.外部连接工作的方式是,在分析连接条件之后,"内侧"与内侧不匹配的所有行都被添加回来......但这一切都发生在处理where子句之前.因此,如果where子句谓词从外连接的外侧过滤属性,则所有这些行将再次被删除...(它们都是空的).将谓词放在连接条件中,然后在将缺少的行添加回来之前对其进行评估...

SELECT b.ID, t.RailType, b.CreatedPieces, 
       b.OutsideSource, b.Charged, b.Rejected, 
       b.RejectedToCrop 
FROM indRailType t
   LEFT JOIN WO_BreakerRail b
        ON t.RailCode = b.RailCode 
            And b.Date = @Date
Run Code Online (Sandbox Code Playgroud)


And*_*zub 5

你可以使用这个where子句:

WHERE WO_BreakerRail.Date = @Date OR WO_BreakerRail.Date IS NULL
Run Code Online (Sandbox Code Playgroud)

  • 使用外连接时,最好在ON子句中考虑任何"isnull work",而不是where子句 (3认同)