问题描述
自从我不得不使用 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
,我可以看到三件事:
- 第一个条件需要括号——或者更好——
IN
。 - 一系列
LEFT JOIN
中除第一个表之外的所有条件都应在ON
子句中。 - 您的字符串有智能引号,但它们应该是“直”单引号。
所以:
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’
) ;