2016-01-13 2 views
1

База данных MS Access 2010, следующее созданы таблицы:MS Access многозначного поля запрос

BazaNalaza колонна:

  • ID - AutoNumber
  • ReportID - номер
  • ResponsibleUnit - число, многозначное поле, связанным с листом ResponsibleUnits

ОтветственныйУниверситет:

  • ID - AutoNumber
  • Имя - текст
  • CompanyLine - текст

ResponsibleUnits содержит следующие данные:

ID + Name  + CompanyLine 
++++++++++++++++++++++++++++++ 
1 + ItOps  + Technology 
2 + IdDev  + Technology 
3 + CRM  + Marketing 
4 + Legal  + ExCo 
5 + ItDWH  + Technology 

После SQL запрос работает нормально:

SELECT * FROM BazaNalaza 
WHERE BazaNalaza.ResponsibleUnit.Value IN (1,2,5) 

Однако следующий код не работает:

SELECT * FROM BazaNalaza 
WHERE BazaNalaza.ResponsibleUnit.Value IN (SELECT ID FROM ResponsibleUnits WHERE CompanyLine = "Technology") 

Второй запрос работает только для строк, где значения в пределах bazaNalaza.ResponsibleUnit начинается с 1, 2 или 5, в то время как поля, которые содержат, например, (3,5) или (4,5) или (3,4,5) не находятся в наборе результатов.

Любые идеи, что не так?

+0

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

ответ

0

Вы действительно не должны иметь многозначные атрибуты. Это нарушает первую нормальную форму.

Этот формат не работает, и вам, возможно, понадобится другая таблица, чтобы отделить этот столбец от таблицы BazaNalaza.

попробовать это

select disinct * from BazaNalaza inner join ResponsibleUnits on ResponsibleUnits.ID = BazaNalaza.ResponsibleUnit.Value 
+0

Да, я знаю, но приложение наследуется и требует быстрого решения (если существует). Кроме того, база данных заполнена таблицами с многозначными полями, поэтому реинжиниринг займет недели :( – Kriss

+0

Второй запрос не возвращает результаты вообще, когда 3, 4 или 5 в результирующем наборе? Что это значит? Работает для меня когда я создаю такие таблицы, как ваш. – jae555

+0

первый запрос работает нормально. Второй не работает. Например, когда у вас есть следующие строки в BazaNalaza: 1; 1; (1,2) 2; 1; (1,3) 3 (4) 4; 1; (3,4) 5; 6; (5) 6; 3; (4,5) Первый запрос будет возвращать линии 1,2,3 , 5 и 6, а второй пропустит линии 3 и 6. Похоже, для сравнения используется только первое значение из многозначного поля? – Kriss

1

запросов с полями подстановки многозначных может быть немного странно, потому что контекст данной таблицы может иногда быть на уровне «родительским», а иногда и на уровне «ребенок» , Однако, похоже, это работает на ваш случай:

SELECT b.* FROM BazaNalaza b 
WHERE 
    EXISTS (
     SELECT ID, ResponsibleUnit.Value FROM BazaNalaza 
     WHERE 
      ID=b.ID 
      AND 
      ResponsibleUnit.Value IN (
       SELECT ID FROM ResponsibleUnits 
       WHERE CompanyLine = "Technology" 
      ) 
    ) 
+0

Спасибо, Горд Томпсон! После двух дней тщательного тестирования я могу подтвердить, что это решение правильное и работает! – Kriss