0

我正在尝试连接两个表,并根据 where 约束以及 group-by-having 条件从这两个表中选择列。我遇到了一些我不理解的问题和行为。我正在使用sybase。下面是一个简单的例子

CREATE TABLE #test(
name varchar(4),
num  int,
cat  varchar(3)
)

CREATE TABLE #other(
name varchar(4),
label varchar(20)
)

Insert #test VALUES('a',2,'aa') 
Insert  #test VALUES  ('b',2,'aa') 
Insert  #test VALUES  ('c',3,'bb')
Insert  #test VALUES ( 'a',3,'aa')
Insert  #test VALUES ( 'd',4,'aa')

Insert #other VALUES('a','this label is a') 
Insert  #other VALUES  ('b','this label is b') 
Insert  #other VALUES  ('c','this label is c')
Insert  #other VALUES ( 'd','this label is d')


SELECT t.name,t.num,o.label  
FROM #other o inner JOIN #test t ON o.name=t.name 
WHERE t.name='a' 
GROUP BY t.name 
HAVING t.num=MAX(t.num)

当我有GROUP BY(标签列显然与不同的 t.name 相关)时,我会变得毫无意义。如果我删除GROUP BY语句,查询的行为与我预期的一样,但是我被迫将其用作子查询然后应用

SELECT * FROM (subquery here) s GROUP BY s.name having s.num=MAX(s.num)

必须有更好的方法来做到这一点。对此行为的任何帮助和解释将不胜感激。

**我应该澄清一下。在我的实际查询中,我有类似 SELECT .... FROM (joined tables) WHERE name IN (long list of names), GROUP BY .....

4

3 回答 3

0

如果我正确理解您的要求,请运行此...

SELECT t.name, num=MAX(t.num), o.label
FROM #other o
INNER JOIN #test t ON o.name=t.name
WHERE t.name='a'
GROUP BY t.name, o.label;

...给了我这个结果:

name num         label
---- ----------- --------------------
a    3           this label is a
于 2012-05-22T17:07:26.790 回答
0

如果我能很好地理解您的查询,您可以尝试以下操作。

SELECT t.name,t.num,o.label  
FROM #other o inner JOIN #test t ON o.name=t.name 
WHERE t.name='a' AND t.num=MAX(t.num)
于 2012-05-22T16:49:44.113 回答
0

您的 GROUP BY 必须包括 t.name、t.num 和 o.label。如果你这样做

GROUP BY t.name, t.num, o.label

然后查询执行没有错误。

但是,您没有计算 group by 中的任何聚合值。
你想做什么?

于 2012-05-22T16:50:22.023 回答