ورود

View Full Version : عدم اجرای این Query



didaaa
یک شنبه 18 تیر 1391, 12:42 عصر
سلام،

دوستان من یه جدول دارم tblA که داخلش رکوردهای تکراری بر حسب کد ملی داره حالا می خوام تمام رکوردهای اونرو داخل جدول tblB بریزم با این شرط که رکوردهای تکراری رو در نظر نگیره که با ارور زیز روبرو میشم.


Msg 2627, Level 14, State 1, Line 4
Violation of PRIMARY KEY constraint 'PK_tblB '. Cannot insert duplicate key in object 'dbo.tblB '.
The statement has been terminated.






این دستور


insert INTO tblB
(Province, City, FirstName, LastName, NID_Stn, NoCardID, Birthdate)

SELECT


distinct

t1.[Pravince]
,t1.[City]

,t1.[FNamePrs]
,t1.[LNamePrs]

,t1.[NID]
,t1.[NoIdCard]


,
t1.[BirthDate]
FROM [STUDENTDB].[dbo].[tblA ] t1
WHERE t1.[NID] NOT IN(SELECT NID_Stn
FROM tblB
)

mas'oud
دوشنبه 19 تیر 1391, 19:31 عصر
سلام

اولا اینکه کلمه کلیدی VALUES در دستور INSERT INTO رو چرا ننوشتی؟؟

دوما میتونی دستور INSERT رو به صورت تک تک بنویس یعنی اینجوری:

INSERT INTO tblName SET Column1=(SELECT Statement1), Column2=(SELECT Statement2), ...


اینجوری متوجه میشی کجا خطا داره

desatir7316
دوشنبه 19 تیر 1391, 22:38 عصر
متن ارورت گفته که مقداری که برای کلید اصلی جدولت می خوای قرار بدی قبلا توی جدول است، خوب مقدار کلید اصلی هم نمی تونه تکراری باشه
یعنی اون مقداری که سلکت کردی قبلا توی جدول هست

baktash.n81@gmail.com
سه شنبه 20 تیر 1391, 07:50 صبح
کلید اصلی جدول b کدوم هست ؟؟

ببین اگه می خوای Distinct کنی باید کل فیلدهایی که تو Select ت وجود داره تکراری باشه ... در غیر اینظورت تکراری محسوب نمی شه ...

در مورد کدی که نوشتی ... از نظر syntax کاملا درسته ... یعنی در این مورد احتیاجی به Value نیست ...

روش هایی وجود داره که بتونی این مشکل رو حل کنی ... اما باید قبلش مشخص کنی که اگه یه کد ملی توی 3 تا رکورد تکرار شده بود ... کدوم رکورد باید توی جدول b ثبت بشه ...

didaaa
پنج شنبه 22 تیر 1391, 11:50 صبح
اینجوری حل شد:

insert INTO tblB
(Province, City, FirstName, LastName, NID_Stn, NoCardID, Birthdate)

SELECT
t1.[Pravince]
,t1.[City]

,t1.[FNamePrs]
,t1.[LNamePrs]

,t1.[NID]
t1.[NoIdCard]

FROM (SELECT
[Pravince]
,[City]

,[FNamePrs]
,[LNamePrs]

,[NID]
,[NoIdCard]


ROW_NUMBER() OVER (PARTITION BY [NID] ORDER BY [NID]) AS RowID
FROM TblMainPerson

) AS t1
WHERE t1.RowID=1