2

ビューからテーブルに一意の値を挿入しようとしています。以下のような表があります:「fromView」にはパスポートに一意の制約がありません

id  | passport | name | surname | address 
1      44543     John    Smith     xxxxx
2      10001     Mike    Thomps    avasfa
3      10001     Mike    Thomps    avasfa
4      10001     Mike    Thomps    avasfa
5      14221     Robert  Martinez  lkjij3

私の「toTable」のデータ構造は同じですが、パスポート列に一意の制約があります。

私の挿入クエリはこれです:

INSERT into toTable (id, passport, name, surname, address) 
SELECT (id, passport, name, surname, address) 
FROM fromView a 
WHERE passport IS NOT NULL AND NOT EXISTS (SELECT * 
                                           FROM toTable b
                                           WHERE b.passport = a.passport)

しかし、これは私に以下のエラーを与えます:

一意のインデックス'toTable_Passport_Unique'を持つオブジェクト'toTable'に重複するキー行を挿入できません。

そのため、テーブルに一意の値を挿入する方法がわかりません。前もって感謝します

4

4 に答える 4

5

次のクエリを実行すると、複数のエントリを持つすべてのパスポートのリストを取得できます。

Select Passport, Count (*) NumEntries
From  fromTable
Group by Passport
Having Count (*) > 1

次に、これらの重複する行をどう処理するかを決定する必要があります。次のクエリを実行して、これらの重複の行全体を確認します。

Select *
From  fromTable
Where Passport In
(
    Select Passport, Count (*) NumEntries
    From  fromTable
    Group by Passport
    Having Count (*) > 1
)
Order by Passport

パスポートごとに最新の行を挿入することにしたとしましょう(つまり、IDが最も高くなります)。このクエリにより、必要なデータが得られます。

Select T1.*
From  fromTable T1
Where Id In
(
    Select Max (Id) Id
    From  fromTable
    Group by Passport
)

を使用して挿入できます

INSERT into toTable (id, passport, name, surname, address) 
Select T1.*
From  fromTable T1
Where Id In
(
    Select Max (Id) Id
    From  fromTable
    Group by Passport
)
于 2011-09-29T13:08:04.457 に答える
2
insert into toTable (id, passport, name, surname, address)
select id, passport, name, surname, address
from (
      select *,
             row_number() over(partition by passport order by id) as rn
      from fromTable
     ) as T
where rn = 1
于 2011-09-29T13:11:45.393 に答える
0
insert into toTable (id, name, surname, addr, passport)
  select
    testA1.id, testA1.name, testA1.surname, testA1.addr, testA1.passport 
  from 
    fromTable as testA1 right join (select min(id) AS distinctID, passport from fromTable group by passport) as testA2 on 
    testA2.distinctID = testA1.id
于 2011-09-29T13:36:54.443 に答える
0

passport同じに対して、、、、が同じであると想定でき、name最新の(最も高い)ものだけが必要な場合は、次のように試してください。surnameaddressid

INSERT INTO toTable (id, passport, name, surname, address)
SELECT max(id), passport, name, surname, address
FROM fromTable
--optional WHERE clause in case there's already data in toTable:
WHERE passport NOT IN (SELECT to.passport from toTable [to])
GROUP BY passport, name, surname, address
于 2011-09-29T13:11:18.433 に答える