我有这个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个结果),但不是正确的字段。我试过的任何JOIN都没有给出正确的数据集(只有大约300个结果)。
答案 0 :(得分:5)
您需要的是全外连接。对于出现在任一表格中的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);
答案 1 :(得分:3)
您无法在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
答案 2 :(得分:0)
我认为你不想要union
。你想要一个join
。如果您加入Account上的字段,您也可以显示Rx.Ct和Ph.Ct。
在union
中,它列出了一个表中的所有行,堆叠在另一个表的顶部,不包括重复项。每行都来自不同的表格。
在join
中,每一行都是两个表的组合,这意味着未连接的列可以包含不同的值。
你走了:
SELECT Ph.Account, Ph.Ct, Rx.Ct FROM Ph INNER JOIN Rx ON Ph.Account=Rx.Account;
答案 3 :(得分:0)
您需要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
更改为您想要的联接类型。详细了解不同类型的联接here。
union
。当您想要获取一组结果并将它们附加到另一个结果的列集时,将使用join
。
答案 4 :(得分:0)
仅供将来有关UNION运营商的参考:
UNION运算符用于组合两个或多个SELECT语句的结果集。
请注意,UNION中的每个SELECT语句必须具有相同的列数。列还必须具有类似的数据类型。此外,每个SELECT语句中的列必须具有相同的顺序。
注意:默认情况下,UNION运算符仅选择不同的值。要允许重复值,请使用UNION ALL。
了解更多信息:UNION Operator