2015-10-07 35 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)(這應該是多餘的,語法錯誤 - 你沒有指定原始表 - 在你的代碼片段)。 –