【问题标题】:SQL isn't working as intendedSQL 未按预期工作
【发布时间】:2015-09-16 12:03:06
【问题描述】:

我在尝试运行的SQL 查询中有一个问题(此时我正在练习)。我正在尝试在 2 个特定日期和一些条件之间获取一些注册表。

问题是,查询无法正常工作,因为它始终只显示相同的注册表,我的意思是,如果有 100 条目,则查询显示 100 次相同的条目。

这是查询:

SELECT Base.Registry.Registry,
       Base.Client.Name,
       Base.Client.Surname1,
       Base.Client.Surname2,
       Base.Client.BirthDate,
       Base.Registry.Edad,
       Base.Client.NIF,
       Base.Registry.Procedency,
       Base.Registry.DateRegistry,
       Base.Registry.DateValidation,
       Base.Registry.CodeSample,
       Base.SnomedRegistry.Code,
       Base.Sample.T
FROM Base.Registry,
     Base.Client,
     Base.SnomedRegistry,
     Base.Sample
WHERE Base.Registry.CodeClient = Base.Client.CodeClient
  AND Base.Registry.Registry = Base.SnomedRegistry.Registry
  AND Base.Registry.CodeSample = Base.Sample.Sample
  AND Base.Registry.DateRegistry BETWEEN '2012-10-26' AND '2012-12-31'
  AND Base.SnomedRegistry.Code LIKE 'M8%%%3'
  OR Base.SnomedRegistry.Code LIKE 'M8%%%2'
  OR Base.SnomedRegistry.Code LIKE 'M8%%%6'
  OR Base.SnomedRegistry.Code LIKE 'M8%%%9'
  OR Base.SnomedRegistry.Code LIKE 'M9%%%2'
  OR Base.SnomedRegistry.Code LIKE 'M9%%%3'
  OR Base.SnomedRegistry.Code LIKE 'M9%%%6'
  OR Base.SnomedRegistry.Code LIKE 'M9%%%9'
  OR Base.SnomedRegistry.Code LIKE 'M69730'
  OR Base.SnomedRegistry.Code LIKE 'M60760'
  OR Base.SnomedRegistry.Code LIKE 'M74000'
  OR Base.SnomedRegistry.Code LIKE 'M74007'
  OR Base.SnomedRegistry.Code LIKE 'M74008'
  LIMIT 0, 100    

我现在对 SQL 非常缺乏经验,所以每一个建议都将不胜感激。

Obs:对不起我的英语。

【问题讨论】:

  • 你需要在where 中加上括号来获得你想要的逻辑。但是,您应该修复您的查询以使用正确的显式 join 语法。简单规则:从不FROM 子句中使用逗号。
  • % 匹配任意数量的字符,甚至是零个字符,因此无需添加 M8%%%2 或使用 _ 匹配一个字符,如 M8___2跨度>

标签: mysql sql tsql


【解决方案1】:

我会发表评论而不是提供答案,但我需要 50 分才能做到这一点。哈哈

我不太清楚为什么你需要像 %%%%% 这样多次使用 %,因为通常一个 % 就足够了。

我会说您的问题与您的 from 语句有关,理想情况下需要使用连接。

我还会在您的like 语句周围使用方括号...

WHERE   1 = 1 
    AND Base.Registry.CodeClient = Base.Client.CodeClient
    AND Base.Registry.Registry = Base.SnomedRegistry.Registry
    AND Base.Registry.CodeSample = Base.Sample.Sample
    AND Base.Registry.DateRegistry BETWEEN '2012-10-26' AND '2012-12-31'
    AND (
            Base.SnomedRegistry.Code LIKE 'M8%3'
            OR Base.SnomedRegistry.Code LIKE 'M8%2'
            OR Base.SnomedRegistry.Code LIKE 'M8%6'
            OR Base.SnomedRegistry.Code LIKE 'M8%9'
            OR Base.SnomedRegistry.Code LIKE 'M9%2'
            OR Base.SnomedRegistry.Code LIKE 'M9%3'
            OR Base.SnomedRegistry.Code LIKE 'M9%6'
            OR Base.SnomedRegistry.Code LIKE 'M9%9'
            OR Base.SnomedRegistry.Code LIKE 'M69730'
            OR Base.SnomedRegistry.Code LIKE 'M60760'
            OR Base.SnomedRegistry.Code LIKE 'M74000'
            OR Base.SnomedRegistry.Code LIKE 'M74007'
            OR Base.SnomedRegistry.Code LIKE 'M74008'
        )
LIMIT 0 , 100

【讨论】:

    【解决方案2】:

    你忘了括号:

    SELECT ...
    FROM Base.Registry, Base.Client, Base.SnomedRegistry, Base.Sample
    WHERE Base.Registry.CodeClient = Base.Client.CodeClient
    AND Base.Registry.Registry = Base.SnomedRegistry.Registry
    AND Base.Registry.CodeSample = Base.Sample.Sample
    AND Base.Registry.DateRegistry
    BETWEEN '2012-10-26' AND '2012-12-31'
    AND (    #<----- here
       Base.SnomedRegistry.Code LIKE 'M8%%%3'
    OR Base.SnomedRegistry.Code LIKE 'M8%%%2'
    OR Base.SnomedRegistry.Code LIKE 'M8%%%6'
    OR Base.SnomedRegistry.Code LIKE 'M8%%%9'
    OR Base.SnomedRegistry.Code LIKE 'M9%%%2'
    OR Base.SnomedRegistry.Code LIKE 'M9%%%3'
    OR Base.SnomedRegistry.Code LIKE 'M9%%%6'
    OR Base.SnomedRegistry.Code LIKE 'M9%%%9'
    OR Base.SnomedRegistry.Code LIKE 'M69730'
    OR Base.SnomedRegistry.Code LIKE 'M60760'
    OR Base.SnomedRegistry.Code LIKE 'M74000'
    OR Base.SnomedRegistry.Code LIKE 'M74007'
    OR Base.SnomedRegistry.Code LIKE 'M74008' 
    )   #<----- here
    LIMIT 0 , 100
    

    【讨论】:

      【解决方案3】:

      使用join 和括号:

      SELECT Base.Registry.Registry, Base.Client.Name, Base.Client.Surname1, Base.Client.Surname2, Base.Client.BirthDate, Base.Registry.Edad, Base.Client.NIF, Base.Registry.Procedency, Base.Registry.DateRegistry, Base.Registry.DateValidation, Base.Registry.CodeSample, Base.SnomedRegistry.Code, Base.Sample.T
      FROM Base.Registry
      inner join Base.Client on Base.Registry.CodeClient = Base.Client.CodeClient
      inner join Base.SnomedRegistry on Base.Registry.Registry = Base.SnomedRegistry.Registry
      inner join Base.Sample on Base.Registry.CodeSample = Base.Sample.Sample
      WHERE Base.Registry.DateRegistry BETWEEN '2012-10-26' AND '2012-12-31'
      AND (Base.SnomedRegistry.Code LIKE 'M8%%%3'
      OR Base.SnomedRegistry.Code LIKE 'M8%%%2'
      OR Base.SnomedRegistry.Code LIKE 'M8%%%6'
      OR Base.SnomedRegistry.Code LIKE 'M8%%%9'
      OR Base.SnomedRegistry.Code LIKE 'M9%%%2'
      OR Base.SnomedRegistry.Code LIKE 'M9%%%3'
      OR Base.SnomedRegistry.Code LIKE 'M9%%%6'
      OR Base.SnomedRegistry.Code LIKE 'M9%%%9'
      OR Base.SnomedRegistry.Code LIKE 'M69730'
      OR Base.SnomedRegistry.Code LIKE 'M60760'
      OR Base.SnomedRegistry.Code LIKE 'M74000'
      OR Base.SnomedRegistry.Code LIKE 'M74007'
      OR Base.SnomedRegistry.Code LIKE 'M74008')
      LIMIT 0 , 100
      

      【讨论】:

        猜你喜欢
        • 2019-08-11
        • 2013-11-27
        • 1970-01-01
        • 1970-01-01
        • 2021-06-02
        • 2021-04-25
        • 2013-01-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多