...あなたが持っていること「コード」に関連付けられた複数の「名前」があり、最長のものを選択したいのですか?同じ長さ(同じコード)で結ばれた2つの名前がある場合はどうなりますか?いずれにしても、おそらくコードだけでグループ化することを意図していました(コードと名前ではなく、グループ化をまったく生成しません)。
ここでは、同じ(最大)長さのすべての名前を選択する基本的な解決方法があります。それ以外の場合は、最も長い名前を持つものが1つしかない場合は、最も長いものを選択します。
select code, name
from acct a
where length(name) = (select max(length(name)) from acct where code = a.code)
;
あるいは、GROUP BYを使用して(代わりに相関サブクエリの)参加:ここ
select a.code, a.name
from acct a inner join
(select code, max(length(name)) as max_len from acct group by code) b
on a.code = b.code and length(a.name) = b.max_len
;
は、より高度な解決策です。与えられたコードでは最長の名前が選ばれ、2つが最長で結ばれている場合はアルファベット順の最初のコードが選択されます。したがって、すべての状況でコードごとに1つの名前しか返しません。 (両方のアプローチのための)
select code, min(name) keep (dense_rank last order by length(name)) as name
from acct
group by code
;
デモ:
with
acct (code, name) as (
select 'CS161', 'C SMITH' from dual union all
select 'CS226', 'C SCHLASINGER' from dual union all
select 'CS161', 'CRAIG L SMITH' from dual union all
select 'CS180', 'V HEUSE' from dual union all
select 'CS180', 'V HAUSE' from dual
)
select code, name
from acct a
where length(name) = (select max(length(name)) from acct where code = a.code)
;
CODE NAME
----- -------------
CS226 C SCHLASINGER
CS161 CRAIG L SMITH
CS180 V HEUSE
CS180 V HAUSE
と
with
acct (code, name) as (
select 'CS161', 'C SMITH' from dual union all
select 'CS226', 'C SCHLASINGER' from dual union all
select 'CS161', 'CRAIG L SMITH' from dual union all
select 'CS180', 'V HEUSE' from dual union all
select 'CS180', 'V HAUSE' from dual
)
select code, min(name) keep (dense_rank last order by length(name)) as name
from acct
group by code
;
CODE NAME
----- -------------
CS161 CRAIG L SMITH
CS180 V HAUSE
CS226 C SCHLASINGER