0

2 つのテーブルを結合し、where 制約と group-by-having 条件に基づいて両方から列を選択しようとしています。理解できない問題や動作が発生しています。私はサイベースを使用しています。以下の簡単な例

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 name IN (名前の長いリスト)、GROUP BY ..... のようなものがあります。

4

3 に答える 3

0

If I understand your requirement correctly, running this...

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;

...gives me this result:

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 に答える