这对我来说似乎很简单,但出于某种原因,我无法理解我正确的SQL。我使用的是SQL Server 2008 R2。
我有一个主键约束违规,我需要运行一个更新语句,主键约束由6个列组成,组成一个唯一的。
我需要对main_id进行选择,并且只返回main_id为SAME main_id的结果,但是main_id可以使EQUAL 2不同于document_id。
IE:寻找相同的唯一main_id = document_id值10以及相同的唯一main_id = document_id值20的位置。
我的最终目的是更多地说main_id = document_id 10,我需要删除带有document_id 10的行,只留下带有document_id 20的行,因为main_id和document_id都是主键约束的PART。 " 10"是垃圾,不应该在那里......只要我能清理它,我就可以运行我的更新声明来解决这个大问题。
我尝试过使用" IN"在where子句中,但是我得到10和20的所有实例,我不想要或不需要.......我只需要知道10和20在哪里共存,共享的main_id是相同的。
答案 0 :(得分:0)
这样的事情?
delete from sometable
where main_id in (
select A.main_id from sometable as A
inner join sometable as B on A.main_id = B.main_id
where A.document_id = 10
and B.document_id = 20
)
and document_id = 10
答案 1 :(得分:0)
您需要有办法返回具有多个main_id的行列表,可以使用此方法完成:
SELECT main_id, document_id
FROM
table
WHERE
main_id IN (
SELECT
main_id
FROM
table
GROUP BY
main_id
HAVING
count(*) > 1
)
有了这个,很容易将其转换为DELETE
表达式,只需将第一个SELECT main_id, document_id
替换为DELETE
,就可以了。