2016-01-12 3 views
0

Я борюсь с довольно простым запросом. Однако, учитывая мой низкий уровень компетенции Access и SQL, я попал в блокнот с моим текущим проектом. Подробности ниже и спасибо вам заблаговременно за ваше терпение.Запрос MS Access, возвращающий повторяющиеся строки

Я объединять данные из нескольких таблиц в один большой набор данных, содержащий все необходимые поля. Я считаю, что способ объединения таблицы «Axle_and_Application_Table» приводит к тому, что запрос возвращает повторяющиеся записи.

SELECT [Purchase Order].POST_DT, 
     Format$(Year([POST_DT]),'00') AS YearField, 
     Format$(Month([POST_DT]),'00') AS MonthField, 
     Format$(Day([POST_DT]),'00') AS DayField, 
     DealerLookup.[Vendor Country], 
     [Purchase Order].VEND_ID, 
     DealerLookup.[Vendor Name], 
     DealerLookup.[Vendor Group], 
     DealerLookup.[Dealer type], 
     [Purchase Order].PRCH_DOC_ID, 
     [Purchase Order].JOB_TYPE_DESC, 
     [Purchase Order].CONTRACT_ID, 
     [Purchase Order].SOLD_TO_CUST_ID, 
     [Purchase Order].LICENCE_PLATE_ID, 
     [Purchase Order].VEHICLE_REG_NBR, 
     [Purchase Order].NAME, 
     [Account Type Lookup].[ACCOUNT NAME], 
     [Purchase Order].location1, 
     [Purchase Order].location2, 
     [Purchase Order].MATERIAL, 
     [Purchase Order].MATL_NAME, 
     [Purchase Order].FOS_TYPE_DESCR, 
     [Purchase Order].SRC_MKT_BRAND_NAME, 
     [Corporate Lookup].Type, 
     [Corporate Lookup].[Brand Groups], 
     [RIM Diameter Lookup].RIM, 
     [Purchase Order].QTY, 
     [Purchase Order].Value1, 
     [Account Type Lookup].[CONTRACT TYPE], 
     [Account Type Lookup].[POLICY FITMENT], 
     [PO Exceptions].[Invalid PO], 
     Axle_and_Application_Table.AXLE, 
     Axle_and_Application_Table.APPLICATION, 
     Axle_and_Application_Table.TBU, 
     Axle_and_Application_Table.[Material Type], 
     Axle_and_Application_Table.TBU, 
     IIf([Material Type]="Service","",[CONTRACT_ID] & [AXLE] & [SRC_MKT_BRAND_NAME] & Replace([FOS_TYPE_DESCR],"Tires","")) AS PID 
FROM ((((([Purchase Order] 
LEFT JOIN DealerLookup ON [Purchase Order].VEND_ID = DealerLookup.[Vendor No]) 
LEFT JOIN [Corporate Lookup] ON [Purchase Order].SRC_MKT_BRAND_NAME = [Corporate Lookup].[BRAND_NAME]) 
LEFT JOIN [Account Type Lookup] ON [Purchase Order].SOLD_TO_CUST_ID = [Account Type Lookup].BILLING) 
LEFT JOIN [PO Exceptions] ON [Purchase Order].PRCH_DOC_ID = [PO Exceptions].[PO Number]) 
LEFT JOIN [RIM Diameter Lookup] ON [Purchase Order].MATERIAL = [RIM Diameter Lookup].MATERIAL) 
LEFT JOIN Axle_and_Application_Table ON [Purchase Order].MATERIAL = Axle_and_Application_Table.Material 
WHERE (((Format$(Year([POST_DT]),'00'))="2015")); 

Структура таблицы (Axle_and_Application_Table):

Material | Axle | Application | TBU | Material Type 
------------------------------------------------------------- 
12345 | Steer | Regional | Truck | Tyre 
12346 | Drive | Municipal | Truck | Tyre 
12347 | Trailer | Regional | Truck | Tyre 

Table Relations Pic...

Я новичок в Access и SQL и оценить, что мне нужно будет значительно развить свои навыки в этой области, чтобы попытаться решите эту проблему!!

Любая помощь или рекомендации, которые вы можете предложить по этому вопросу, будут высоко оценены.

Еще раз спасибо.

+1

Пожалуйста, переформатируйте свой запрос, его очень трудно прочитать сейчас. Также опубликуйте структуру, отношения и образцы данных таблицы. – HoneyBadger

+0

Спасибо, что посмотрели на это. Я внесла некоторые поправки в мой вопрос. Я надеюсь, что все в порядке, если есть что-то еще, что я могу добавить, это поможет, я обязательно попробую. –

ответ

1

Мы не можем знать, какая из объединенных таблиц имеет несколько совпадающих записей и, таким образом, создает дубликаты записей в результате.

Вы можете взглянуть на результат: сравнить две повторяющиеся записи, есть ли какие-либо столбцы, которые отличаются? Если да, то вы нашли нарушившуюся таблицу.

Или: в дизайне запроса удалите соединенные таблицы один за другим, затем проверьте результат. Когда больше нет дубликатов записей, последний удаленный стол был виновником.

Затем: найдите лучший критерий соединения или добавьте предложение WHERE для этой таблицы, чтобы оно возвращало только одну запись.

// Из вашего окна отношений ни одна из таблиц не имеет первичного ключа?

-> Да, это действительно проблема. Реляционная база данных зависит от первичных ключей, чтобы определить отношения между таблицами.

В Axle_and_Application_Table, Material представляется очевидным выбором для первичного ключа, так как он используется в соединении.
Но если это тот, который создает дубликаты, должны быть дубликатами в Axle_and_Application_Table.Material

Это либо ошибка, либо требуется дополнительная критериума присоединиться таблицу Purchase Order.

Но прежде чем что-либо делать, вы должны проанализировать свою базу данных и установить или добавить соответствующие первичные ключи, см., Например, здесь: Add or change a table’s primary key in Access

+0

Спасибо Андре, это правильно, ни одна из таблиц не имеет первичного ключа. База данных Access фактически была разработана моим предшественником, и я пытаюсь работать с ней и добавлять новую таблицу и присоединяться (axle_and_application_table). Должны ли таблицы иметь первичный ключ? Я проверил, по мере устранения, какая таблица вызывает ошибку. Это таблица Axle_and_Application_Table. Спасибо за помощь. –

+0

@LeeFrancis: см. Править. – Andre

+0

Спасибо, Андре, это блестяще. Я добавлю первичные ключи и посмотрю, как добавить предложение WHERE, как вы предложили, и посмотреть, какой результат. В очередной раз благодарим за помощь. –

Смежные вопросы