SQL联盟同时保留所有字段值(MS Access)

时间:2016-10-12 12:58:44

标签: sql ms-access union

如何以下列方式联合Access SQL中的两个表:

表A

UserID Name Option
A      John O1
B      Doe  O2 

表B

UserID Option
A      O3
B      O4

当前输出:

UserID Name Option      
A      John O1
A      -    O3
B      Doe  O2
B      -    O4

期望的输出:

UserID Name Option      
A      John O1
A      John O3
B      Doe  O2
B      Doe  O4

当前查询(常规联盟):

 SELECT UserID, Name, Option
 FROM TableA
 UNION ALL
 SELECT UserID, Null As Name, Option
 FROM TableB

而不是Null As Name,我想基于UserID接管TableA的名称。使用这样的子选择不起作用:

 SELECT UserID, Name, Option
 FROM TableA
 UNION ALL
 SELECT UserID, (Select TOP 1 Name FROM TableA WHERE TableA.UserID = UserID) As Name, Option
 FROM TableB

上面的查询无法正常工作,可能是因为它不知道要引用哪个UserID。

是否可以获得所需的输出?它决不能通过结合来实现。

我正在考虑通过VBA而不是SQL查询逐行进行。

4 个答案:

答案 0 :(得分:0)

如果Userid在TableA中没有重复项,只需执行left join

SELECT UserID, Name, Option
FROM TableA
UNION ALL
SELECT tb.UserID, ta.Name, tb.Option
FROM TableB tb
LEFT JOIN TableA ta ON tb.UserID = ta.UserID

答案 1 :(得分:0)

我认为它应该有用

 SELECT UserID, Name, Option
 FROM TableA
 UNION ALL
 SELECT TableB.UserID, Name, TableB.Option
 FROM TableB LEFT JOIN TableA
 ON TableB.UserID=TableA.UserID

答案 2 :(得分:0)

其他两个选项都很好,但我想指出这一点:

如果您符合UserID值,则可以使用您尝试过的子查询来执行此操作:

SELECT UserID, Name, Option
FROM TableA
UNION ALL
SELECT UserID, 
       (Select TOP 1 Name 
        FROM TableA 
        WHERE TableA.UserID = TableB.UserID) As Name, 
      Option
FROM TableB

虽然我重新格式化了这一点,但我唯一改变的是将TableA.userID = UserID转为TableA.UserID = TableB.UserID。这 - 子查询引用子查询外部的表 - 称为相关子查询,BTW。

答案 3 :(得分:0)

您需要(内部)加入TableA才能获得Name

SELECT A.UserID, A.Name, A.Option
  FROM TableA A
UNION
SELECT A.UserID, A.Name, B.Option
  FROM TableA A 
       INNER JOIN TableB B
          ON A.UserID = B.UserID;