Доступ к SQL: выбор объединения, показать оба поля - PullRequest
4 голосов
/ 04 января 2012

У меня есть этот SQL:

SELECT Ph.Account, Ph.Ct FROM Ph
UNION SELECT Rx.Account, Rx.Ct FROM Rx;

, который работает нормально, но поля Ph.Ct и Rx.Ct не всегда могут быть одинаковыми.Поэтому я хотел отобразить оба из них, но в запросе отображается только 1 поле «Ct», а не оба.

Как сделать так, чтобы оно отображало оба?

Вот ph:

12685      3
29568      1
38771      2

Вот rx:

10657      1
12685      2
68781      2
79874      1

Что я хочу получить из запроса:

Account    ph.ct    rx.ct
10657               1
12685      3        2
29568      1
38771      2
68781               2
79874               1

UNION получает правильный набор данных (около 800 результатов), но не правильные поля.Любые соединения, которые я пробовал, не дают правильный набор данных (только около 300 результатов).

Ответы [ 5 ]

5 голосов
/ 04 января 2012

Вам нужно полное внешнее соединение. Для каждого значения Account, фигурирующего в любой таблице, это даст соответствующие значения Ct для каждой таблицы, если заданное значение Account появится, а в противном случае - ноль.

select Account,Ph.Ct as ph_ct,Rx.Ct as rx_ct
from Ph full outer join Rx on (Ph.Account=Rx.Account);

Редактировать: Поскольку Access, по-видимому, не поддерживает полные внешние соединения (по какой-то ужасной причине), вы можете добиться того же эффекта с объединением левого объединения с правым объединением:

select Ph.Account, Ph.Ct as ph_ct, Rx.Ct as rx_ct
from Ph left join Rx on (Ph.Account=Rx.Account)
union
select Rx.Account, Ph.Ct as ph_ct,Rx. Ct as rx_ct
from Ph right join Rx on (Ph.Account=Rx.Account);

, что также эквивалентно (вероятно, быстрее):

select Ph.Account, Ph.Ct as ph_ct, Rx.Ct as rx_ct
from Ph left join Rx on (Ph.Account=Rx.Account)
where (Rx.Account IS NULL)
union all
select Rx.Account, Ph.Ct as ph_ct, Rx.Ct as rx_ct
from Ph right join Rx on (Ph.Account=Rx.Account);
3 голосов
/ 04 января 2012

Вы не можете иметь полное внешнее объединение в MS Access, поэтому:

SELECT m.Account, Ph.Ct, Rx.Ct FROM
((SELECT Ph.Account FROM Ph
UNION SELECT Rx.Account FROM Rx) As m
LEFT JOIN Ph ON m.Account = Ph.Account)
LEFT JOIN Rx ON m.Account = Rx.Account 
0 голосов
/ 04 января 2012

Только для будущих ссылок об UNION Operator:

Оператор UNION используется для объединения результирующего набора из двух или более операторов SELECT.

Обратите внимание, что каждый оператор SELECT в UNION должен иметь одинаковое количество столбцов. Столбцы также должны иметь похожие типы данных. Кроме того, столбцы в каждом операторе SELECT должны быть в том же порядке.

Примечание. Оператор UNION по умолчанию выбирает только различные значения. Чтобы разрешить повторяющиеся значения, используйте UNION ALL.

Для получения дополнительной информации: Оператор UNION

0 голосов
/ 04 января 2012

Вы хотите join, а не union:

select
    coalesce(Ph.Account, Rx.Account) as Account
    Ph.Ct,
    Rx.Ct
from
    Ph
    full outer join Rx on
        Ph.Account = Rx.Account

Вы можете изменить inner на нужный тип объединения. Подробнее о различных типах соединений здесь .

union s используются, когда вы хотите взять один набор результатов и добавить их в набор строк другого результата. join s используются, когда вы хотите взять один набор результатов и добавить их в набор столбцов другого результата.

0 голосов
/ 04 января 2012

Я не думаю, что вы хотите union. Вы хотите join. Если вы присоединитесь к полям в учетной записи, вы также можете отобразить Rx.Ct и Ph.Ct.

В union он перечисляет все строки из одной таблицы, расположенные поверх другой таблицы, за исключением дубликатов. Каждая строка из другой таблицы.

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

Вот, пожалуйста:

SELECT Ph.Account, Ph.Ct, Rx.Ct FROM Ph INNER JOIN Rx ON Ph.Account=Rx.Account;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...