SQL select仅查找2列值仅对应1列id

时间:2015-10-07 00:23:34

标签: sql-server tsql

这对我来说似乎很简单,但出于某种原因,我无法理解我正确的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是相同的。

2 个答案:

答案 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,就可以了。