Доступ к удалению НЕКОТОРЫХ ЧАСТЕЙ дубликатов в 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
Access отлично подходит, если вы создаете макет базы данных или, может быть, создаете доказательство концепции? .. но он плохо масштабируется и, как вы можете видеть, не соответствует спецификациям 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