Вставьте разные значения SQL Server - PullRequest
2 голосов
/ 29 сентября 2011

Я пытаюсь вставить уникальные значения в таблицу из представления.У меня есть таблица, как показано ниже: «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' с уникальным индексом 'toTable_Passport_Unique'.

Итак, я не знаю, как вставить уникальные значения в мою таблицу.Заранее спасибо

Ответы [ 4 ]

4 голосов
/ 29 сентября 2011

Вы можете получить список всех паспортов с несколькими записями, выполнив этот запрос:

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

Допустим, вы решили использовать самую новую строку, вставленную для каждого паспорта (то есть идентификатор будет самым высоким), этот запрос дастВы данные, которые вам нужны.

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
)
2 голосов
/ 29 сентября 2011
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
0 голосов
/ 29 сентября 2011
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
0 голосов
/ 29 сентября 2011

Если мы можем предположить, что для того же passport у нас будут одинаковые name, surname и address, и мы хотим только самые последние (самые высокие) id, тогда попробуйте,

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...