Re: Re: Problem with duplicate rows when FULL OUTER JOIN'ing 3 derived tables
От | Andreas Joseph Krogh |
---|---|
Тема | Re: Re: Problem with duplicate rows when FULL OUTER JOIN'ing 3 derived tables |
Дата | |
Msg-id | VisenaEmail.224.f0e0ebce2fcc534b.14691fa99d2@tc7-on обсуждение исходный текст |
Ответ на | Re: Problem with duplicate rows when FULL OUTER JOIN'ing 3 derived tables (David G Johnston <david.g.johnston@gmail.com>) |
Список | pgsql-sql |
På torsdag 12. juni 2014 kl. 22:36:23, skrev David G Johnston <david.g.johnston@gmail.com>:
[snip]WITHa_src (companyid, projectid, a_count) AS ( SELECT companyid, COALESCE(projectid,'N/A'), a_count FROM company_a), b_src (companyid, projectid, b_count) AS ( SELECT companyid, COALESCE(projectid,'N/A'), b_count FROM company_b), left_master AS ( SELECT DISTINCT companyid, projectid FROM a_src UNION DISTINCT SELECT DISTINCT companyid, projectid FROM b_src)SELECT companyid, projectid, a_count, b_countFROM left_masterLEFT JOIN a_src USING (companyid, projectid)LEFT JOIN b_src USING (companyid, projectid);If it is too slow to derive left_master you can consider adding triggers to the company_product tables to maintain a separate table of known combinations.The chaining version:WITHa_src (companyid, projectid, a_count) AS ( SELECT companyid, COALESCE(projectid,'N/A'), a_count FROM company_a), b_src (companyid, projectid, b_count) AS ( SELECT companyid, COALESCE(projectid,'N/A'), b_count FROM company_b), c_src (companyid, projectid, c_count) AS ( SELECT companyid, COALESCE(projectid,'N/A'), c_count FROM company_c)SELECT companyid, projectid, a_count, b_count, c_countFROM (a_src FULL JOIN b_src USING (companyid, projectid)) ab_src FULL JOIN c_src USING (companyid, projectid)) abc_src;Though you could also test whether the following is faster:a_raw FULL JOIN b_raw ON ((a_raw.companyid, COALESCE(a_raw.projectid, 'N/A')) = (b_raw.companyid, COALESCE(b_raw.projectid, 'N/A')))Alternatively...go vertical:WITHa_src (companyid, projectid, item_count, item_type) AS ( SELECT companyid, COALESCE(projectid,'N/A'), a_count, 'A' FROM company_a), b_src (companyid, projectid, item_count, item_type) AS ( SELECT companyid, COALESCE(projectid,'N/A'), b_count, 'B' FROM company_b)SELECT *FROM a_srcUNION ALLSELECT *FROM b_src;David J.
Your chaining version with WITH was the only one I could get to work.
I think that is the cleanest version as it wraps the rather large query behind the derived tables in a readable fashion.
Thanks!
--
Andreas Jospeh Krogh
CTO / Partner - Visena AS
Mobile: +47 909 56 963
Вложения
В списке pgsql-sql по дате отправления: