SQL Server вставляет данные из таблицы1 в таблицу2, где таблица1 = данные таблицы3 - PullRequest
0 голосов
/ 14 января 2011

Я пытаюсь вставить в таблицу A уникальные данные из таблицы B, которые соответствуют данным в TAble C, но я продолжаю получать сообщение об ошибке первичного ключа и не уверен, что я делаю неправильно Таблица A - bookfeed Таблица B - bookFТаблица C - bookStats

INSERT INTO bookFeed
 (entryId,feed,entryContent,pubDate,authorName,authorId,age,
  sex,locale,pic,fanPage, faceTitle,feedtype,searchterm,clientId,dateadded)
SELECT DISTINCT b.entryId,b.feed,b.entryContent,b.pubDate,b.authorName,
    b.authorId,b.age,b.sex,b.locale,b.pic,b.fanPage,b.faceTitle,b.feedtype,
    b.searchterm, b.clientId,b.dateadded 
  FROM bookF as b
  INNER JOIN bookStats as a on a.feed = b.feed 
       WHERE NOT EXISTS (SELECT * 
                           FROM bookFeed as c 
                          WHERE c.entryId = b.entryId)

Таблица BookFeed имеет первичный ключ для entryId

Ответы [ 2 ]

2 голосов
/ 14 января 2011

Похоже, в таблице bookF есть записи-дубликаты для каждой записи. Если вам нужен только один entryId (ограничен PK на bookFeed), вы можете использовать это. Отрегулируйте порядок в ROW_NUMBER, чтобы удовлетворить

insert into bookFeed (
    entryId,feed,entryContent,pubDate,authorName,authorId,age,
    sex,locale,pic,fanPage,faceTitle,feedtype,searchterm,clientId,dateadded)
select
    entryId,feed,entryContent,pubDate,authorName,authorId,age,
    sex,locale,pic,fanPage,faceTitle,feedtype,searchterm, clientId,dateadded
from
(
    select rn=Row_number() over (partition by b.entryId order by b.entryId),
        b.entryId,b.feed,b.entryContent,b.pubDate,b.authorName,b.authorId,b.age,
        b.sex,b.locale,b.pic,b.fanPage,b.faceTitle,b.feedtype,b.searchterm, b.clientId,b.dateadded
    from bookF as b
    inner join bookStats as a on a.feed = b.feed
    left join bookFeed as c on c.entryId=b.entryId
    where c.entryId is null
) X
where rn=1
1 голос
/ 14 января 2011

ОБНОВЛЕНИЕ: Попробуйте это для своего запроса и посмотрите, работает ли оно, посмотрите на данные и посмотрите, есть ли дубликаты, означающие, что все записи должны иметь идентификатор записи, отличный от того, что там в настоящее время -

SELECT b.entryId,b.feed,b.entryContent,b.pubDate,b.authorName,
    b.authorId,b.age,b.sex,b.locale,b.pic,b.fanPage,b.faceTitle,b.feedtype,
    b.searchterm, b.clientId,b.dateadded 
  FROM bookF as b
  INNER JOIN bookStats as a on a.feed = b.feed 
       WHERE b.entryId IN (SELECT distinct entryid 
                           FROM bookFeed)

Я думаю, что вы пытаетесь вставить идентификатор записи, который является первичным ключом (проверьте, не является ли значение, которое пытается вставить, не является дубликатом, нулем или нарушает какое-либо другое ограничение первичного ключа) ... так что либо не пытайтесь вставить если он заполняется автоматически или если вы хотите вставить его, включите идентификационную вставку .. и повторите попытку ...

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...