4

我在使用 access 时遇到了这个问题:我正在使用 RIGHT + LEFT 外连接来克服 ACCESS 不支持 FULL JOIN 的事实。

SELECT *
FROM T1 RIGHT OUTER JOIN T2
ON T1.xxx = T2.xxx 
UNION 
SELECT *
FROM T1 LEFT OUTER JOIN T2
ON T1.xxx = T2.xxx 

在这些桌子上:

T1:
ID1 | xxx | fieldA
a     1       X
b     2       Y
c     3       Z

T2:
ID2 | xxx | fieldB
d      2       K
e      3       J
f      4       H

结果我得到了一个具有这种结构的表

T1.xxx | T2.xxx | fieldA | fieldB | ID1 | ID2
   1                 X               a
   2        2        Y       K       b     d
   3        3        Z       J       c     e
            4                H             f

xxx 不是主键但具有相同的名称和数字类型(整数)

我从许多其他地方看到,这应该通过折叠两张表来工作!这里不是(同一行上的元素,当非空白时,当然是相同的)

我的期望

FINAL TABLE:
    xxx |  ID1 | ID2 |fieldA | fieldB
     1      a            X
     2      b     d      Y       K
     3      c     e      Z       J
     4            f              H
4

4 回答 4

1

似乎这两个表都有不同的列值集,您可能拥有t1.xxx并且t2.xxx具有相同的值,但其他列没有,union在这种情况下不会合并这两个记录

尝试类似的东西

SELECT T1.xxx
FROM T1 RIGHT OUTER JOIN T2
ON T1.xxx = T2.xxx 
UNION 
SELECT T2.xxx
FROM T1 LEFT OUTER JOIN T2
ON T1.xxx = T2.xxx 

像这样的东西应该为您提供表 1表 2xxx中的所有值,忽略.duplicatexxx

于 2013-07-25T14:47:55.327 回答
0

我的解决方案(绝对不优雅):

SELECT [QUERY1].XX, ID1, ID2, fieldA, fieldB
FROM (T2 RIGHT JOIN [QUERY1] ON T2.xxx = [QUERY1].XX) LEFT JOIN T1 ON [QUERY1].XX = T1.XX;

其中 QUERY1 如下:

(SELECT CInt(NZ(T1.xxx,T2.xxx)) as XX
    FROM T1 RIGHT OUTER JOIN T2
    ON T1.xxx = T2.xxx
    UNION 
    SELECT CInt(NZ(T1.xxx,T2.xxx)) as XX 
    FROM T1 LEFT OUTER JOIN T2
    ON T1.xxx = T2.xxx)
    UNION (SELECT CInt(NZ(T2.xxx,T1.xxx))  as xx1
    FROM T1 RIGHT OUTER JOIN T2
    ON T1.xxx = T2.xxx
    UNION 
    SELECT CInt(NZ(T2.xxx,T1.xxx)) as xx1
    FROM T1 LEFT OUTER JOIN T2
    ON T1.xxx = T2.xxx);

注意 xx1 没有被使用,甚至没有在表中显示

于 2013-07-25T22:56:27.967 回答
0

试试这个:我已经尝试并获得了两个结果集。

DECLARE @T1 TABLE
(
ID1 VARCHAR(2) ,XXX INT, FIELDA VARCHAR(2)
)
DECLARE @T2 TABLE
(
ID2 VARCHAR(2) ,XXX INT, FIELDB VARCHAR(2)
)


INSERT INTO @T1 VALUES 
('a',     1,       'X'),
('b',     2,       'Y'),
('c',     3,       'Z')

INSERT INTO @T2 VALUES 
('d',     2,       'k'),
('e',     3,       'j'),
('f',     4,       'h')

SELECT
    ISNULL(CONVERT(VARCHAR(1),T1.xxx),' ') AS [T1.xxx] , 
    ISNULL(CONVERT(VARCHAR(1),T2.xxx),'') AS [T2.xxx] , 
    ISNULL(fieldA,'') AS [fieldA], 
    ISNULL(fieldB,'') AS [fieldB] , 
    ISNULL(ID1,'') AS [ID1] , 
    ISNULL(ID2,'') AS [ID2]
FROM 
(
    SELECT XXX as XXX1 FROM @T1
    UNION
    SELECT XXX as XXX1  FROM @T2
)T LEFT OUTER JOIN 
@T1 T1 ON T.XXX1 = T1.XXX 
LEFT OUTER JOIN
@T2 T2 ON T.XXX1 = T2.XXX

- - - - - - - - - - - 结果 - - - - - - - - -

T1.xxx  T2.xxx  ID1 ID2 fieldA  fieldB
1       a       X   
2   2   b   d   Y   k
3   3   c   e   Z   j
    4       f       h

SELECT
    ISNULL(CONVERT(VARCHAR(1),T.xxx1),' ') AS [xxx] ,
    ISNULL(ID1,'') AS [ID1] ,   
    ISNULL(ID2,'') AS [ID2],
    ISNULL(fieldA,'') AS [fieldA], 
    ISNULL(fieldB,'') AS [fieldB] 

FROM 
(
    SELECT XXX as XXX1 FROM @T1
    UNION
    SELECT XXX as XXX1  FROM @T2
)T LEFT OUTER JOIN 
@T1 T1 ON T.XXX1 = T1.XXX 
LEFT OUTER JOIN
@T2 T2 ON T.XXX1 = T2.XXX

- - - - - - - - - - - 结果 - - - - - - - - -

xxx ID1 ID2 fieldA  fieldB
1   a       X   
2   b   d   Y   k
3   c   e   Z   j
4       f       h

于 2013-10-17T06:54:03.113 回答
0

您观察到的行为最可能的解释是返回的行不相同,它们不是完全重复的。

运算符将UNION删除重复的行,但除此之外它不会对“折叠表”做任何事情。


要获得指定的结果集(在更新的问题中),这里有一个返回结果的 SQL 模式。(我不知道 Access 是否支持这一点,但这适用于 MySQL、SQL Server、Oracle 等)

 SELECT i.xxx
      , v1.ID AS ID1
      , v2.ID AS ID2   
      , v1.fieldA AS fieldA   
      , v2.fieldB AS fieldB   
   FROM (
          SELECT t1.xxx AS xxx
            FROM T1 t1
           UNION
          SELECT t2.xxx
            FROM T2 t2
        ) i
   LEFT
   JOIN T1 v1
     ON v1.xxx = i.xxx
   LEFT
   JOIN T2 v2
     ON v2.xxx = i.xxx

(注意:如果不能保证 xxx 在每个表中都是唯一的,则此查询可能会生成重复的行。)

于 2013-07-25T14:53:14.067 回答