Как сравнить две строки в одной таблице MDB? - PullRequest
0 голосов
/ 24 февраля 2011

У меня есть одна таблица MDB со следующей структурой:

  • Поле1 Поле2 Поле3 Поле4
  • A ...
  • B ...

Я пытаюсь использовать запрос для перечисления всех различных полей строки A и B в наборе результатов:

SELECT * From Table1
WHERE Field1 = 'A'
UNION 
SELECT * From Table1
WHERE Field1 = 'B';

Однако в этом запросе есть две проблемы:

  1. в нем перечислены все поля, включая идентичные ячейки, с большим столом

  2. выдает сообщение об ошибке: слишком определено много полей.

Как я могу обойти эти проблемы?

Ответы [ 2 ]

1 голос
/ 24 февраля 2011

Не проще ли просто выбрать все необходимые поля из таблицы на основе значения Field1 и сгруппировать необходимые значения?

Так что-то вроде этого:

SELECT field1, field2,...field195
FROM Table1
WHERE field1 = 'A' or field1 = 'B'
GROUP BY field1, field2, ....field195

Это даст вам все строки, где field1 - это A или B, и есть разница в одном из выбранных полей.

Да, и для оператора group by, а также для части SELECT, действительно используйте ранее упомянутый режим редактирования для запроса. Там вы можете добавить все поля (выбрав их в таблицу и перетащив их вниз), которые необходимы в результате, затем нажмите кнопку «итоги» на ленте, чтобы добавить групповые выражения для всех. Тогда вам нужно только добавить предложение Where, и все готово.


Теперь, когда вопрос более понятен (вы хотите, чтобы запрос выбирал поля вместо записей на основе конкретных требований), мне придется изменить свой ответ на:

Это невозможно. (пока не доказано обратное);)

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


Одна вещь, которая МОЖЕТ помочь в этом случае, это посмотреть на дизайн базы данных. Правильно ли сделаны эти таблицы? Предположим, у вас есть 190 из этих полей, которые являются просто деталями основных данных. Вы можете разделить это в другой таблице, так что у вас есть основная таблица и таблица подробностей. Таблица сведений может выглядеть примерно так:

 ID   ID_Main   Det_desc   Det_value

Таким образом, вы можете отфильтровать все значения Detail, которые равны между двумя основными значениями A и B, используя что-то вроде:

Select a.det_desc, a.det_value, b.det_value
(Select Det_desc, det_value
from tblDetails
where id_main = a) as A inner join
(Select Det_desc, det_value
from tblDetails
where id_main = a) as B
on A.det_desc = B.det_desc and A.det_value <> B.det_value

При желании вы можете снова присоединиться к своему основному столу.

0 голосов
/ 24 февраля 2011

Вы можете full join сама таблица, совпадающая с одинаковыми строками. Затем вы можете отфильтровать несоответствия, если одна из двух соединяемых частей - null. Например:

select  *
from    (
        select  *
        from    Table1
        where   Field1 = 'A'
        ) A
full join
        (
        select  *
        from    Table1
        where   Field1 = 'B'
        ) B
on      A.Field2 = B.Field2
        and A.Field3 = B.Field3
where   A.Field1 is null 
        or B.Field1 is null

Если у вас есть 200 полей, попросите Access создать список столбцов, создав запрос в режиме конструктора. Переключитесь на просмотр SQL и скопируйте / вставьте. Редактор с режимом столбцов (например, UltraEdit) поможет создать запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...