Достъп до премахване на ОПРЕДЕЛЕНИ ЧАСТИ от дубликати в Union Query

Работя в Access 2007 и не знам нищо за SQL и много, много малко VBA. Опитвам се да направя заявка за обединение, за да съединя две таблици и да изтрия дубликатите.

НО, много от моите дубликати имат информация в един запис, който не е в другия. Не е 100% точен дубликат.

Пример,
Ред 1: A, B, ПРАЗНО
Ред 2: A, ПРАЗНО, C

Искам да ОБЕДИ и двете, за да завърши като един ред от A, B, C.

Намерих подобен въпрос тук, но изобщо не разбирам отговора. Всяка помощ ще бъде високо оценена.


person msim    schedule 27.10.2014    source източник
comment
Успяхте ли да намерите решение на проблема си?   -  person crthompson    schedule 01.11.2014
comment
В момента не знам достатъчно за SQL, за да знам какво правя. Също така вървим в различна посока с работата на базата данни. Наистина ви благодаря за помощта и се надявам един ден да го разбера :)   -  person msim    schedule 04.11.2014
comment
Няма проблем, надявам се, че посоката ви се отдалечава от достъпа. :) Успех и на теб.   -  person crthompson    schedule 04.11.2014
comment
какво трябва да използвам/научавам вместо достъп? Вече получих този коментар много и бих искал да знам кое е по-добро. Благодаря!   -  person msim    schedule 06.11.2014
comment
Достъпът е страхотен, ако макетирате база данни или може би създавате доказателство за концепцията? .. но не се мащабира добре и както виждате не отговаря на спецификациите на ANSI sql. Ако сте в света на Microsoft, опитайте SQL Server. Има налично безплатно издание, за да започнете. MySql е друга популярна алтернатива.   -  person crthompson    schedule 06.11.2014
comment
успяхте ли да работи?   -  person crthompson    schedule 17.12.2014


Отговори (2)


Бих предложил запитване като това:

select
  coalesce(t1.a, t2.a) as a,
  coalesce(t1.b, t2.b) as b,
  coalesce(t1.c, t2.c) as c
from
  table1 t1
  inner join table2 t2 on t1.key = t2.key

Тук използвах ключовата дума coalesce. Това ще вземе първата ненулева стойност в списък със стойности. Също така имайте предвид, че използвах key, за да обознача колоната, която е една и съща между двата реда. От вашия пример изглежда като A, но не мога да съм сигурен.

person crthompson    schedule 27.10.2014
comment
Благодаря ви, прилагам ли това с VBA или в SQL изгледа на заявката за обединяване? - person msim; 28.10.2014
comment
@msim Бихте използвали това в sql изгледа вместо заявката за обединение. - person crthompson; 28.10.2014
comment
Най-накрая имам възможност да опитам това. Трябва ли да променя t1 и t2 на имената на моите таблици? Използвах A, B, C за примера, но моите полета имат имена, така че трябва ли да ги поставя в [] скоби? Всички колони, към които се присъединявам, са еднакви, така че това влияе ли върху стойността на ключа? Съжалявам за многобройните въпроси, бих се радвал да разбера по-добре всичко това. Благодаря отново. - person msim; 28.10.2014
comment
@msim t1 и t2 са псевдоними. Те не трябва да се променят, просто променете table1 и table2 на имената на вашите таблици. Не трябва да имате нужда от скоби, освен ако нямате име на таблица или колона с интервали (те трябва да се избягват). Ако всяка колона може да има нулева стойност в нея, тогава вероятно трябва да я вземете на части, като обработвате всяка колона поотделно. - person crthompson; 29.10.2014

Ако първата ви таблица има всички ключови стойности, тогава можете да направите:

select t1.a, nz(t1.b, t2.b), nz(t1.c, t2.c) as c
from table1 as t1 left join
     table2 as t2
     on t1.a = t2.a;

Ако това не е така, можете да използвате тази доста загадъчна изглеждаща конструкция:

select t1.a, nz(t1.b, t2.b), nz(t1.c, t2.c) as c
from table1 as t1 left join
     table2 as t2
     on t1.a = t2.a
union all
select t2.a, t2.b, t2.c
from table2 as t2
where not exists (select 1 from table1 as t1 where t1.key = t2.key)

Първата част на обединението получава редовете, където има ключова стойност в първата таблица. Вторият получава редовете, където ключовата стойност е във втория, но не и в първия.

Имайте предвид, че това е много по-трудно в Access, отколкото в други (смея да кажа „истински“) бази данни. MS Access не поддържа общи таблични изрази (CTE), unions в подзаявки или full outer join -- всички те биха помогнали за опростяване на заявката.

person Gordon Linoff    schedule 27.10.2014