代码之家  ›  专栏  ›  技术社区  ›  David Raznick

是否有人编写了一个更高级别的查询语言(比sql)来为有限的模式上的常见任务生成sql

  •  1
  • David Raznick  · 技术社区  · 17 年前

    sql是查询语言中的标准,但是它有时有点冗长。我目前正在编写有限的查询语言,这将使我的常见查询更快地编写,并减少一点精神负担。

    如果您在一个好的数据库模式上编写一个查询,实际上您将总是在主键、外键字段上进行连接,因此我认为不必每次都声明它们。

    所以一个查询可能看起来像。

    select s.name, region.description from shop s
    where monthly_sales.amount > 4000 and s.staff < 10
    

    我们的关系是

    购物——多对一——地区,

    商店——一对多——每月销售额

    将是eqivilent的sql将是

    select distinct s.name, r.description 
    from shop s 
    join region r on shop.region_id = region.region_id 
    join monthly_sales ms on ms.shop_id = s.shop_id  
    where ms.sales.amount > 4000 and s.staff < 10 
    

    (当您加入一对多表(每月销售额)并且您没有从该表中选择字段时,差异就存在了)

    我知道,对于某些模式,上面的原始查询可能是不明确的,即两个表之间是否存在两个关系路由但是有很多方法可以解决这些问题,特别是如果您限制了允许的模式。无论如何,大多数可能的模式都不值得考虑。

    我只是想知道是否有人试图做这样的事情? (我已经看到了大多数orm解决方案,可以简化一些查询)

    编辑:我真的很喜欢sql。我使用了orm解决方案并查看了linq到目前为止,我看到的最好的是SQLalchemy(针对python)然而,据我所见,他们并没有提供我想要的东西。

    6 回复  |  直到 17 年前
        1
  •  2
  •   Nir Levy    17 年前

    hibernate和linqtosql正是您想要的

        2
  •  2
  •   MusiGenesis    17 年前

    我认为你最好把时间花在写更多的sql上,并且变得更适应它。我认识的大多数开发人员都经历过这样的过程,在那里,他们最初接触SQL的经历激励他们编写自己的ORM或一组帮助类来自动生成SQL,从而完全绕过SQL通常他们会继续添加和优化它,直到它和sql一样复杂(如果不是更复杂的话)。结果有时相当滑稽——我继承了一个应用程序,它有一个名为“And.cs”和“Or.cs”的类,其主要功能是将“And”和“Or”分别添加到字符串中。

    SQL是为了处理各种各样的复杂性而设计的。如果应用程序的数据设计很简单,那么操作该数据的SQL也将很简单对于简单的事情使用不同类型的查询语言,然后对于复杂的事情使用sql,这没有多大意义,因为sql可以很好地处理这两种事情。

        3
  •  1
  •   Mez    17 年前

    我相信任何(体面的) ORM 会有帮助的。。

        4
  •  1
  •   Marc Gravell    17 年前

    Entity SQL 轻微地 比Transact-SQL更高的级别(位置)除此之外, HQL 等,用于对象模型方法,LINQ( IQueryable<T> )更高的级别,允许简单的导航:

    var qry = from cust in db.Customers
              select cust.Orders.Sum(o => o.OrderValue);
    

        5
  •  0
  •   Gav    17 年前

    马丁·福勒把全部的能量都注入这个系统,产生了 Active Record 模式我想这就是你要找的?

        6
  •  0
  •   Otávio Décio    17 年前

    不确定这是否符合您要查找的内容,但我一直在根据数据访问对象的定义动态生成sql;这样做的目的是反映类,并且默认情况下假定其名称是表名,所有属性都是列。我也有搜索条件对象来构建where部分。dao可以包含其他dao类的列表,并指导连接。

    由于您需要一些东西来处理大多数重复的sql,所以这种方法可以做到这一点。如果没有,我只能求助于手写的sql或存储过程。