SQL 问题 - 我的 WHERE 子句有什么问题

问题描述

自从我不得不使用 sql 并且不得不编写查询以来已经有几年了——但我得到了我没想到的结果。我花了很多时间查看它,我确定我遗漏了一些明显的东西,但是当我在下面运行时,我的查询返回了 RateCode 值,而不是我的 WHERE声明。

我做错了什么?我觉得这是一个足够基本的查询(而且我开始恐慌我已经失去了我的技能)

SELECT
    cs.Acct AS Site,cs.Addr1 AS Address,cs.City,cs.State,m.TypeDescr AS Service,se.Quantity,se.SvcCode,se.SvcDescr,sf.FreqDescr AS Frequency,se.SvcId,se.StartDate,se.EndDate,sr.ReasonDescr AS Reason,svr.RateCode,svr.StartDate AS RateStartDate,svr.EndDate AS RateEndDate

FROM
    wiSvcEquipment AS se
    LEFT JOIN wiCustSite    AS cs  ON cs.SiteId    = se.SiteId
    LEFT JOIN wiMaterial    AS m   ON m.MatSubType = se.MatSubType
    LEFT JOIN wiSvcReason   AS sr  ON sr.ReasonID  = se.ReasonID
    LEFT JOIN wiSvcVendrate AS svr ON svr.SvcId    = se.SvcID
    LEFT JOIN wiSvcCustRate as scr ON scr.RateCode = se.RateCode
    LEFT JOIN wiSvcFreq     AS sf  ON sf.FreqID    = se.FreqID

WHERE
    se.CustId = ‘013714’
    OR
    se.CustId = ‘014831’
    AND 
    svr.RateCode IN (
        ‘CHGCMBHAUL’,‘CHGHAUFLAT’,‘CHGHAUL2’,‘CHGHAUL3’,‘CHGHAULCOM’,‘CHGHAULFE’,‘CHGHAULING’,‘CHGHAULMIN’,‘CHGVCMBHAU’,‘CHGVHAUFLT’,‘CHGVHAULFE’,‘CHGVHAULNG’,‘CHGWKDHAUL’,‘CLIHAUFLAT’,‘CLIHAULFE’,‘CLIHAULING’
    ) ;

解决方法

更改您的 WHERE 以对两列使用 IN

WHERE
    se.CustId IN ( '013714','014831' )
    AND 
    svr.RateCode IN (
        'CHGCMBHAUL','CHGHAUFLAT','CHGHAUL2','CHGHAUL3','CHGHAULCOM','CHGHAULFE','CHGHAULING','CHGHAULMIN','CHGVCMBHAU','CHGVHAUFLT','CHGVHAULFE','CHGVHAULNG','CHGWKDHAUL','CLIHAUFLAT','CLIHAULFE','CLIHAULING'
    );

或者使用显式逻辑组:

WHERE
    (
        se.CustId = '013714'
        OR
        se.CustId = '014831'
    )
    AND 
    svr.RateCode IN (
        'CHGCMBHAUL','CLIHAULING'
    );

上述两个子句完全相同:在 SQL 中,x IN ( a,b,c ) 运算符只是一系列 ( x = a OR x = b OR x = c ) 比较的语法糖。

,

你的意思是

(se.CustId = ‘013714’ OR se.CustId = ‘014831’)

AND 优先于 OR

,

我可以看到三件事:

  1. 第一个条件需要括号——或者更好——IN
  2. 一系列 LEFT JOIN 中除第一个表之外的所有条件都应在 ON 子句中。
  3. 您的字符串有智能引号,但它们应该是“直”单引号。

所以:

SELECT . . .
FROM wiSvcEquipment se
     wiCustSite cs 
     ON cs.SiteId = se.SiteId LEFT JOIN
     wiMaterial m  
     ON m.MatSubType = se.MatSubType LEFT JOIN
     wiSvcReason sr 
     ON sr.ReasonID = se.ReasonID AND
            svr.RateCode IN ('CHGCMBHAUL','CHGHAULMIN’,'CLIHAUFLA’,'CLIHAULING'
                            ) LEFT JOIN

        LEFT JOIN
     wiSvcVendRate svr
     ON svr.SvcId = se.SvcID LEFT JOIN
     wiSvcCustRate scr
     ON scr.RateCode = se.RateCode LEFT JOIN
     wiSvcFreq sf 
     ON sf.FreqID = se.FreqID
WHERE se.CustId IN ('013714','014831')
,

如果 se.CustId = ‘013714’ 子句得到满足,那么无论 retcode 是什么,这个查询都将返回行。

您是否打算使用以下条件:

WHERE
    (se.CustId = ‘013714’
    OR
    se.CustId = ‘014831’)
    AND 
    svr.RateCode IN (
        ‘CHGCMBHAUL’,‘CHGHAUFLAT’,‘CHGHAUL2’,‘CHGHAUL3’,‘CHGHAULCOM’,‘CHGHAULFE’,‘CHGHAULING’,‘CHGHAULMIN’,‘CHGVCMBHAU’,‘CHGVHAUFLT’,‘CHGVHAULFE’,‘CHGVHAULNG’,‘CHGWKDHAUL’,‘CLIHAUFLAT’,‘CLIHAULFE’,‘CLIHAULING’
    ) ;