我正在尝试连接两个表,并根据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(连接表)WHERE名称IN(长名称列表),GROUP BY .....
答案 0 :(得分: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)
答案 1 :(得分:0)
您的GROUP BY必须包含t.name,t.num和o.label。如果你这样做
GROUP BY t.name, t.num, o.label
然后查询执行没有错误。
但是,您不会计算组中的任何聚合值 你想做什么?
答案 2 :(得分: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