2012-01-03 60 views
4

我有这样的SQL:访问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 

一个工会获得了正确的数据集(约800个结果),但不是正确的领域。我尝试过的任何JOIN都没有给出正确的数据集(只有约300个结果)。

回答

5

你需要的是一个完整的外连接。对于出现在任一表中的Account的每个值,如果出现Account的给定值,则将给出每个表的相应值Ct,否则为空。

select Account,Ph.Ct as ph_ct,Rx.Ct as rx_ct 
from Ph full outer 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) 
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); 
+0

我做了尝试,但完全改变了数据集。我发布的SQL提供了800个结果,这是正确的,使用ALL得到1200个结果,这不是我需要的结果。不仅如此,Access仍然只显示一个“Ct”字段与ALL无关。 – JBurace 2012-01-03 23:35:06

+0

在这种情况下,请编辑您的问题,并附上一些示例输入和相应的示例输出,以便我能够理解您要求的内容。 – 2012-01-03 23:36:06

+0

@JackBurace - 所以...你想要在“Account”上加入一个左连接,然后呢? – 2012-01-03 23:43:15

0

我不认为你想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; 
+0

这不会提供与我发布的UNION相同的数据集。矿给〜800(这是正确的),这给了~400。数据集需要相同,只是其他字段需要显示。 – JBurace 2012-01-04 00:25:16

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 s用于当您想要取一组结果并将它们附加到另一个结果的行集时。当您想要取一组结果并将它们追加到另一个结果的列集时,可以使用join

+0

我已经尝试了一个内部连接,但是这只返回〜300个不是我想要的记录。我希望查询返回两个表中的所有条目,除了重复项(但仍包含两个表中的条目,一次)。 – JBurace 2012-01-03 23:49:35

+0

我不认为Access中存在'full join',正如其他评论中所述。 – JBurace 2012-01-04 00:18:47

0

就有关联合运营商将来参考:

UNION运算符用于将结果集两个或多个SELECT语句的结合。

请注意,UNION中的每个SELECT语句必须具有相同的列数。这些列也必须具有相似的数据类型。另外,每个SELECT语句中的列必须以相同的顺序排列。

注意:默认情况下,UNION运算符只选择不同的值。要允许重复值,请使用UNION ALL。

欲了解更多信息:UNION Operator

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 
+0

这更明显为什么'UNION'与'FULL OUTER JOIN'类似 – 2012-01-04 00:08:57

+0

奇怪的是,这似乎并没有给出正确的数据集。它只返回〜400,这不是我发布的UNION返回的数量(〜800)。我认为这只是返回只存在于两个表中的条目,这不是我正在寻找的。 – JBurace 2012-01-04 00:17:20

+0

@Jack糟糕LEFT JOIN是你想要的。 – Fionnuala 2012-01-04 00:25:54