Если единственной разницей между строками являются нулевые и ненулевые значения, то перед объединением можно использовать агрегат:
-- CTE for sample data
with "#TEMP" (city, country, state, id) as (
select 'Great Falls', null, 'VA', 12345 from dual
union all select 'Great Falls', 'USA', 'VA', 12345 from dual
)
-- actual query
select max(city) as city, max(country) as country, max(state) as state,
max(city) ||', ' ||max(country)|| ', '||max(state) as concat_fields
from "#TEMP"
group by id;
CITY COU ST CONCAT_FIELDS
----------- --- -- --------------------
Great Falls USA VA Great Falls, USA, VA
Если строки для идентификатора имеют разные ненулевые значения,это, очевидно, не сработает:
with "#TEMP" (city, country, state, id) as (
select 'Great Falls', null, 'VA', 12345 from dual
union all select 'London', 'UK', null, 12345 from dual
)
select max(city) as city, max(country) as country, max(state) as state,
max(city) ||', ' ||max(country)|| ', '||max(state) as concat_fields
from "#TEMP";
CITY CO ST CONCAT_FIELDS
----------- -- -- -------------------
London UK VA London, UK, VA
, но тогда вам понадобится какой-то способ определить, какая строка является правильной - например, из столбца последовательности или даты, если это представляет историю адресов для клиента, и вы хотитеПоследняя версия.Хитрость заключается в том, чтобы узнать, что является «последним».