4

アクセスを使用するとこの問題が発生します。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 は主キーではありませんが、名前と数値型 (整数) が同じです

他の多くの場所から、2 つのテーブルを折りたたむことでこれが機能することがわかりました。ここではそうではありません(空白でない場合、同じ行の要素はもちろん同じです)

私の期待

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

これら2つのテーブルの両方に異なる列値のセットがあるようです。同じ値を持つ可能性がありますがt1.xxxt2.xxx他の列にunionはありません。この場合、これら2つのレコードは結合されません

次のようなものを試してください

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表 2からのすべてのxxx値を与えるはずです。duplicatexxx

于 2013-07-25T14:47:55.327 に答える
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重複する行を削除しますが、それ以外の「テーブルを折りたたむ」ことは何もしません。


(更新された質問で) 指定された結果セットを取得するために、結果を返す 1 つの 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 に答える