使用不带WHERE子句的外部联接时,SQL语句将忽略我的日期条件

时间:2019-02-27 19:09:06

标签: sql sql-server outer-join

在没有值的情况下,我使用outer join来空白行,但是为什么忽略行并获取所有日期

AND t.TradeDate BETWEEN @firstOfMonth AND @maxTradeDate

如果我将AND更改为WHERE,则可以,但是我丢失了需要清零的行

--DAILY
SELECT
    a.[Name] AS RepName, 
    CONVERT(VARCHAR, a.TradeDate, 107) AS TimePeriod, 
    ISNULL(SUM(CASE t.CancelCode
                   WHEN '1' THEN t.Quantity * -1
                   ELSE t.Quantity
               END), 0) AS Quantity, 
    ISNULL(SUM(CASE t.CancelCode
                  WHEN '1' THEN t.Principal * -1
                  ELSE t.Principal
               END), 0) AS Principal, 
    ISNULL(SUM(CASE t.CancelCode
                  WHEN '1' THEN t.TradeConcession * -1
                  ELSE t.TradeConcession
               END), 0) AS Comm, 
    1 AS TheOrder
FROM 
    dayreps a
LEFT JOIN 
    Trades t ON a.TradeDate = t.TradeDate 
             AND a.RepID = t.RepID
             AND t.TradeDate BETWEEN @firstOfMonth AND @maxTradeDate
GROUP BY 
    a.[Name], a.TradeDate

2 个答案:

答案 0 :(得分:1)

通过在OUTER JOIN的{​​{1}}子句中包含条件,您是说不符合此条件不能排除左表(ON)中的行。而是将这些行为NULL,就像其他连接条件失败的行一样。

因此,原则上将条件移至dayreps子句是正确的,但是您还必须注意条件的含义。如果你放

WHERE

t.TradeDate BETWEEN @firstOfMonth AND @maxTradeDate 子句中,如果日期超出范围,或者WHERE -NULL对于外部联接为空的任何行。

幸运的是,您可以改用

t.TransDate

,并且由于这来自您的左表,因此将其放在a.TradeDate BETWEEN @firstOfMonth AND @maxTradeDate 子句中不会阻止外部联接。

答案 1 :(得分:-1)

我相信是通过LEFT JOIN进行的,因为LEFT JOIN如果存在匹配项,则独立地从第一个表中获取所有记录,在这种情况下,第一个表是dayreps。

尝试使用内部联接

 SELECT
     a.[Name] AS RepName, 
            CONVERT(VARCHAR, a.TradeDate, 107) AS TimePeriod, 
            ISNULL(SUM(CASE t.CancelCode
                           WHEN '1'
                           THEN t.Quantity * -1
                           ELSE t.Quantity
                       END), 0) AS Quantity, 
            ISNULL(SUM(CASE t.CancelCode
                           WHEN '1'
                           THEN t.Principal * -1
                           ELSE t.Principal
                       END), 0) AS Principal, 
            ISNULL(SUM(CASE t.CancelCode
                           WHEN '1'
                           THEN t.TradeConcession * -1
                           ELSE t.TradeConcession
                       END), 0) AS Comm, 
            1 AS TheOrder
     FROM dayreps a
          INNER JOIN Trades t ON a.TradeDate = t.TradeDate and a.RepID = t.RepID
      AND t.TradeDate BETWEEN @firstOfMonth AND @maxTradeDate
      GROUP BY a.[Name], 
               a.TradeDate

选中此What is the difference between "INNER JOIN" and "OUTER JOIN"?

PD:对不起,我的英语,我在此工作=)