0

同じ列を持つ3つのテーブルがあり、それらを1つのテーブルに結合する必要があります。一部のIDは複数のテーブルに表示されます。最初に、番号が最も小さいテーブルのIDを使用し、後続のテーブルではそのIDを無視する必要があります。IDのみが同じであり、テーブル間に重複する行がないことに注意してください。

したがって、例として、これら3つのテーブルをファイナルテーブルに変換する必要があります。

**Table 1**
+----+----+----+
| ID | C1 | C2 |
+----+----+----+
| 01 | AA | BB |
| 02 | CC | DD |
| 03 | EE | FF |
+----+----+----+

**Table 2**
+----+----+----+
| ID | C1 | C2 |
+----+----+----+
| 03 | GG | HH |
| 04 | II | JJ |
| 05 | KK | LL |
+----+----+----+

**Table 3**
+----+----+----+
| ID | C1 | C2 |
+----+----+----+
| 01 | MM | NN |
| 04 | OO | PP |
| 06 | QQ | RR |
+----+----+----+

**Resulting Table**
+----+----+----+
| ID | C1 | C2 |
+----+----+----+
| 01 | AA | BB |
| 02 | CC | DD |
| 03 | EE | FF |
| 04 | II | JJ |
| 05 | KK | LL |
| 06 | QQ | RR |
+----+----+----+

左結合と「ISNULL」条件を使用した解決策について漠然とした考えがありますが、特にテーブルの数が増えると、非常にすぐに複雑になる可能性があります。

行全体ではなく、1つの列にのみ重複を指定する方法はありますか?

4

2 に答える 2

2

Accessを使用しているので、FIRST関数を使用できますが、必要なのはこれだけだと思います。

SELECT ID, First(C1) As C1, First(C2) as C2
FROM (
  SELECT * FROM Table1 UNION SELECT * FROM Table2 UNION SELECT * FROM Table3 )
GROUP BY ID
于 2012-11-08T16:19:07.810 に答える
1

NULL値がカウントされない場合は、次のロジックを適用できます。

  • 3つのテーブルに存在するすべてのIDを取得します(これはユニオン部分です)
  • すべてのテーブルを左結合し、COALESCEを使用して、各列の最初のnull以外の値を見つけます

アクセスMS SQL:

select ids.ID, COALESCE(t1.C1,t2.C1,t3.C1) C1, COLAESCE(t1.C2,t2.C2,t3.C2) C2 
from
(SELECT ID FROM Table1
UNION
SELECT ID FROM Table2
UNION
SELECT ID FROM Table3) AS ids
left join Table1 t1 on ids.id=t1.id
left join Table2 t2 on ids.id=t2.id
left join Table3 t3 on ids.id=t3.id

しかし、Accessは悲しいことにCOALESCEをサポートしていません...それはNZを持っています:

select ids.ID, NZ(NZ(t1.C1,t2.C1),t3.C1) C1, NZ(NZ(t1.C2,t2.C2),t3.C2) C2 
from
(SELECT ID FROM Table1
UNION
SELECT ID FROM Table2
UNION
SELECT ID FROM Table3) AS ids
left join Table1 t1 on ids.id=t1.id
left join Table2 t2 on ids.id=t2.id
left join Table3 t3 on ids.id=t3.id

(現時点では、MS Accessが手元にないことをテストすることはできませんが)

補足:Oracleでは、これを行うことができます(削除したくありませんでした):

select ids.ID, NVL(NVL(t1.C1,t2.C1),t3.C1) C1, NVL(NVL(t1.C2,t2.C2),t3.C2) from
(SELECT ID FROM Table1
UNION
SELECT ID FROM Table2
UNION
SELECT ID FROM Table3) ids
left join Table1 t1 on ids.id=t1.id
left join Table2 t2 on ids.id=t2.id
left join Table3 t3 on ids.id=t3.id

ただし、NULL値が有効であると見なされる場合、 MS AccessはCASE-WHENステートメントをサポートしていないため(VBAを除く)、これは少し問題になります。

Oracleでは、これは次のようになります。

select ids.ID,
CASE WHEN t1.ID IS NOT NULL THEN t1.C1 
     WHEN t1.ID IS NULL AND t2.ID IS NOT NULL THEN t2.C1
     ELSE t3.C1 END C1,
CASE WHEN t1.ID IS NOT NULL THEN t1.C2 
     WHEN t1.ID IS NULL AND t2.ID IS NOT NULL THEN t2.C2
     ELSE t3.C2 END C2
from
(SELECT ID FROM Table1
UNION
SELECT ID FROM Table2
UNION
SELECT ID FROM Table3) AS ids
left join Table1 t1 on ids.id=t1.id
left join Table2 t2 on ids.id=t2.id
left join Table3 t3 on ids.id=t3.id
于 2012-11-08T15:28:03.377 に答える