2015-10-07 55 views
-1

这似乎很简单,但由于某种原因,我无法让我的头泵出正确的SQL。我正在使用SQL Server 2008 R2。SQL选择查找只有2列值对应于只有1列ID

我有一个主键约束违反,我需要运行一个更新语句,而主键约束由6列放在一起构成一个唯一的。

我需要在main_id上做一个选择,并且只在main_id是相同的main_id时返回结果,但是main_id可以等于2个不同的document_id。

IE:寻找其中相同的唯一main_id = DOCUMENT_ID值10也是在相同的唯一main_id = DOCUMENT_ID值20

我的最终目的是wheverever说main_id = DOCUMENT_ID 10,我需要删除的行与document_id 10一样,仅留下具有document_id 20的行,因为main_id和document_id都是主键约束的PART。 “10”是垃圾,不应该在那里......只要我可以清理它,我可以运行我的更新声明来修复这个大混乱。

我试过在where子句中使用“IN”,但后来我得到了10和20的所有实例,我不想或不需要.......我只是简单地需要知道在哪里10和20与共享的main_id是一致的。

+1

我认为一些示例数据会试图解释您尝试解决什么问题。 –

回答

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 
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,即可完成。

+0

感谢你们两位,你给了我很好的想法,如何拿出一个选择,让我看看我想要什么。 我想通过2个不同的document_id值找到共享的main_id(如果你愿意的话)。 下面是我从代码示例中得出的结果: |||| 从document_audit中选择main_id,document_id,create_timestamp,created_by其中main_id(从document_audit选择a.main_id作为内部联接document_audit作为b在a.main_id = b.main_id其中a.document_id = 10和b.document_id = 20)以及document_id IN(10,20)ORDER BY main_id |||| 这给了我需要的main_id。 – searcherrr

+0

我无法让代码块在这里工作。我尝试'代码'...也许我需要尝试[代码]测试[代码] .......反正上面的选择给了我相同的main_id由2个不同的值document_id共享,这让我找到并删除包含我想要删除的document_id 10的记录。 – searcherrr

+0

然后正确的答案是@will_,我没有得到你想要的特定行与documentID IN(10,20)(这应该是多余的,语法错误 - 你没有指定原始表 - 在你的代码片段)。 –