我以前遇到過這個問題,從來沒有真正知道問題是什麼。我希望你大師之一那裏幫助解釋是什麼導致一個WHERE子句是ignored.The大畫面的問題是:什麼導致T-SQL中的WHERE子句被忽略?
當WHERE子句被忽略了,哪來開始尋找最好的地方?
什麼通常會導致此問題?
在這個特定的情況下,我試圖過濾掉某些服務代碼。我嘗試過使用NOT LIKE子句,或者只是使用IN()子句將我想要的服務代碼列入白名單,但聲明完全被忽略。每個服務代碼也與一個服務類相關聯,並且使用這些相同的運算符來過濾或白名單所需的服務類別什麼也不做。我試着將NOT LIKE和IN子句作爲我的WHERE下的第一個標準,如果它是一個操作順序問題,並且我已經在某處檢查了缺少的括號的三重檢查。所以,這個查詢返回的結果沒有任何錯誤消息,但它不會過濾掉不需要的行。
查詢的是一個爛攤子,因爲每一張發票有5個不同的領域,一個TechID可以在各場標誌着不同的東西,但這裏的查詢:
SELECT
(
SELECT
"LocationCode"
FROM
"Locations"
WHERE
"Invoices"."LocationID" = "Locations"."LocationID"
) AS "Location",
"Invoices"."OrderNum",
"Invoices"."ServiceCode",
"Invoices"."WorkDate",
"Invoices"."Total",
-- "Classes"."Code" AS "ServiceClass",
(
SELECT
"Employees"."Username"
FROM
"Employees"
WHERE
"Employees"."TechId" = "Invoices"."TechID1"
) AS 'Tech',
(
SELECT
"Employees"."Username"
FROM
"Employees"
WHERE
"Employees"."TechId" = "Invoices"."TechID2"
) AS 'Helper',
(
SELECT
"Employees"."Username"
FROM
"Employees"
WHERE
"Employees"."TechId" = "Invoices"."TechID3"
) AS 'Sales Blue 1',
(
SELECT
"Employees"."Username"
FROM
"Employees"
WHERE
"Employees"."TechId" = "Invoices"."TechID4"
) AS 'Sales Blue 2',
(
SELECT
"Employees"."Username"
FROM
"Employees"
WHERE
"Employees"."TechId" = "Invoices"."TechID5"
) AS 'Term Self',
CASE
WHEN --Self Gen
"Invoices"."TechID5" IN (
'298',
'194',
'330',
'391',
'335'
) THEN
(
SELECT
"Employees"."Username"
FROM
"Employees"
WHERE
"Employees"."TechId" = "Invoices"."TechID5"
)
WHEN --Sales Blue 2
"Invoices"."TechID4" IN (
'298',
'194',
'330',
'391',
'335'
) THEN
(
SELECT
"Employees"."Username"
FROM
"Employees"
WHERE
"Employees"."TechId" = "Invoices"."TechID4"
)
WHEN --Sales Blue 1
"Invoices"."TechID3" IN (
'298',
'194',
'330',
'391',
'335'
) THEN
(
SELECT
"Employees"."Username"
FROM
"Employees"
WHERE
"Employees"."TechId" = "Invoices"."TechID3"
)
END AS "Sales Rep",
CASE
WHEN --Self Gen
"Invoices"."TechID5" IN (
'298',
'194',
'330',
'391',
'335'
) THEN
'Self-Gen'
WHEN --Sales Blue 2
"Invoices"."TechID4" IN (
'298',
'194',
'330',
'391',
'335'
) THEN
'BSP Lead 2'
WHEN --Sales Blue 1
"Invoices"."TechID3" IN (
'298',
'194',
'330',
'391',
'335'
) THEN
'BSP Lead'
ELSE
'Error'
END AS "Sale Status"
FROM
(
(
"Employees" "Employees"
INNER JOIN "Invoices" "Invoices" ON "Employees"."TechID" = "Invoices"."TechID3"
)
INNER JOIN "Services" "Services" ON "Invoices"."ServiceCode" = "Services"."Code"
)
INNER JOIN "Classes" "Classes" ON "Services"."ClassID" = "Classes"."ClassID"
WHERE
-- Brian is 298, Cindy is 194, Jeremiah is 330, Monty is 391, and Tom is 335.
-- Technician AND Sales Rep
"Invoices"."ServiceCode" IN (
'BED BUG CHEM CO',
'BED BUG CHEM'
)
AND (
"Invoices"."TechID1" IN (
'298',
'194',
'330',
'391',
'335'
)
AND "Invoices"."TechID3" IN (
'298',
'194',
'330',
'391',
'335'
)
OR "Invoices"."TechID5" IN (
'298',
'194',
'330',
'391',
'335'
)
)
OR -- Sales Blue 1, Sold but BSPC Lead
"Invoices"."TechID3" IN (
'298',
'194',
'330',
'391',
'335'
)
OR --Sales Blue 2
"Invoices"."TechID4" IN (
'298',
'194',
'330',
'391',
'335'
)
OR --Term Self (Gen)
"Invoices"."TechID5" IN (
'298',
'194',
'330',
'391',
'335'
)
AND (
"Invoices"."WorkDate" <= GetDate()
AND YEAR ("Invoices"."WorkDate") = YEAR (GetDate())
)
AND "Invoices"."ServiceCode" NOT LIKE 'EOM%'
AND "Invoices"."ServiceCode" NOT LIKE 'EOM1%'
AND "Invoices"."ServiceCode" NOT LIKE 'M_%'
AND "Invoices"."ServiceCode" NOT LIKE 'M1%'
AND "Invoices"."ServiceCode" NOT LIKE 'Q_%'
AND "Invoices"."ServiceCode" NOT LIKE 'Q1__%'
/*
AND "Classes"."Code" NOT IN ('EOM', 'QUARTERLY', 'MONTHLY')
*/
ORDER BY
"Sales Rep",
"Sale Status"
任何意見或忠告,將不勝感激。謝謝!
看起來像另一個人混合'OR'和'AND'的情況,而不是非常小心小括號。 –
爲什麼你有雙引號內的所有字段和表? – FLICKER
TechIDX字段是字符串還是數字?你將它們封裝在單引號中,表示它們是字符串。 –