2017-02-21 69 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')