可能的sybase sql查询

Posted

技术标签:

【中文标题】可能的sybase sql查询【英文标题】:Possible sybase sql query 【发布时间】:2013-04-18 10:23:37 【问题描述】:

多年后我正在尝试重新使用 sql。我也是 Sybase 的新手。您能否就以下问题提出一个可能的查询?

有一个表叫蔬菜如下。

| product | price | date     |
| beans   | 1.78  | 20040903 |
| beans   | 1.79  | 20040902 |
| potato  | 1.78  | 20040902 |

我需要获取每种蔬菜的最新可用价格。预期的数据库是 sybase。非常感谢。

【问题讨论】:

【参考方案1】:

您可以使用子查询为每个 product 获取 max(date),然后重新加入您的表:

select v1.product, 
  v1.price,
  v1.date
from vegetables v1
inner join
(
  select product, max(date) MaxDate
  from vegetables
  group by product
) v2
  on v1.product = v2.product
  and v1.date = v2.maxdate;

见SQL Fiddle with Demo(演示是SQL Server,但语法应该是有效的)。

如果您的 Sybase 版本支持窗口函数,那么您可以使用以下内容:

select product, price, date
from 
(
  select product, price, date,
    row_number() over(partition by product order by date desc) rn
  from vegetables
) v
where rn = 1;

见SQL Fiddle with Demo

【讨论】:

select product, max(date) MaxDate from vegetables group by product --为什么我们不能使用这个查询? SQL Fiddle 因为他们希望 price 与最大日期相关联,如果您添加,您也必须按它进行分组,并且值是不同的。 @bluefeet 很好的答案。以及 sql fiddle 的重要提示(不知道那个)。我在概念上考虑进行此类操作,但不确定语法。现在我看到它是有道理的。 “分区上的行号”语法对我来说是新的。将不得不查找。非常感谢。 @junkie 欢迎您,我认为并非所有版本的 Sybase 都支持 row_number,因此您必须检查您的版本。 :)【参考方案2】:

据我了解,标准 SQL 查询在大多数情况下应该可以在 Sybase 数据库上运行。我不是数据库管理员,但这样的事情可能会起作用:

SELECT * FROM 
  vegetables v 
INNER JOIN 
  (SELECT 
      iv.id, 
      MAX(iv.date) AS date
    FROM 
      vegetables iv 
    GROUP BY 
      iv.id
  ) maxv ON maxv.date = v.date

【讨论】:

以上是关于可能的sybase sql查询的主要内容,如果未能解决你的问题,请参考以下文章

怎么通过excel连接Sybase IQ数据库?然后可以在excel里面通过SQL查询该数据库

Sybase,将字符串作为sql查询执行

Sybase 上的慢速 SQL 查询

SQL Server 2008,Sybase - 低带宽上的大型选择查询

经历:sybase的sql查询,当传递的参数中包含全角空格(u00a0),查询慢

sybase数据库 如何使用sql语句查询,数据库容量大小和数据库使用量大小