2017-02-21 32 views
0

是不是有什麼毛病代碼:SQL程序改變了我的代碼

SELECT Konta.ID, Konta.Okres, Konta.Symbol, Konta.Nazwa 
FROM ep15_opisie.dbo.Konta Konta 
WHERE (LEN(Konta.Symbol)='5') AND (((Konta.Symbol Like '%221%') OR (Konta.Symbol Like '%222%') OR (Konta.Symbol Like '%302%') OR (Konta.Symbol Like '%700%')) 

但我使用程序(Microsoft查詢)更改代碼:

SELECT Konta.ID, Konta.Okres, Konta.Symbol, Konta.Nazwa 
FROM ep15_opisie.dbo.Konta Konta 
WHERE (Konta.Symbol Like '%221%') AND (LEN(Konta.Symbol)='5') OR (Konta.Symbol Like '%222%') AND (LEN(Konta.Symbol)='5') OR (Konta.Symbol Like '%302%') AND (LEN(Konta.Symbol)='5') OR (Konta.Symbol Like '%700%') AND (LEN(Konta.Symbol)='5') 

它乘以LEN論據。這對我來說沒有意義,因爲我希望所有的參數的LEN都是5,但是不同的Like'XXX')。我正在使用SQL Server。

什麼是最好的方法只使用一個LEN參數?

+0

只是問......是兩個查詢的結果不相似嗎?因爲該程序正在生成一個邏輯上等效的查詢...您想要A AND(B或C或D);它打開括號並給你(A和B)或(A和C)或(A和D)和A。 – dev8080

+1

請記住,與更多過程語言不同,沒有保證條件的評估順序或評估多少次相同子句(前提是它們是確定性的)。兩個查詢在邏輯上是相同的,優化器應該爲任一個生成相同的計劃。 (另外,如果這是查詢或視圖嚮導改變你的代碼,簡單的答案是停止使用可視化設計器,只使用普通的查詢窗口 - 它們不會重新排列你的代碼) –

+0

是的,查詢的結果是一樣。我想要做的是減少代碼的長度。如果我想包含第三個條件會怎麼樣?隨着每個條件的增加,代碼的長度將會爆炸。 – DJVarmian

回答

0

我覺得解析器是邏輯上沒錯。無論如何,試圖寫這樣的東西呢。我認爲表演可能保持不變。

SELECT * 
FROM (
    SELECT Konta.ID 
     ,Konta.Okres 
     ,Konta.Symbol 
     ,Konta.Nazwa 
    FROM ep15_opisie.dbo.Konta Konta 
    WHERE (
      (
       (Konta.Symbol LIKE '%221%') 
       OR (Konta.Symbol LIKE '%222%') 
       OR (Konta.Symbol LIKE '%302%') 
       OR (Konta.Symbol LIKE '%700%') 
       ) 
      ) 
    ) Konta 
WHERE (LEN(Konta.Symbol) = '5') 
相關問題