2014-06-19 67 views
0

讓我們假設我們有一個名爲Reserations(PK, clientID, ORDER_NUMBER, CREDIT_CARD)的表。客戶可以進行多次預訂,但是當CREDIT_CARD不爲空(意味着客戶已預付訂單)簽證,萬事達卡等時,預訂被視爲完成。Sql多個預留和重複價值

因此,我們有這張桌子充滿了保留,我想按照以下規則進行清理:如果客戶做出了有效的預訂(信用卡不是NULL),那麼如果此客戶有其他未支付的預訂(信用卡爲空),我會自動爲他保留(意思是我將在CREDIT_CARD列中添加信用卡類型,該列對於此特定客戶端爲空)。否則,客戶無效(不是一個有效的信用卡),他的記錄將被刪除。

如何在SQL微軟訪問中實現這一點?我的想法是: 選擇表格,刪除重複並更新記錄。這裏唯一的問題是如何知道是否至少有一個有效的預訂?也許使用計數功能來計算每個客戶端的有效預留量?

回答

1

如果我的理解是正確的,您必須爲此使用以下查詢。 首先刪除誰沒有作出任何保留(CREDIT_CARD IS NULL)客戶端全部保留,使用下面的查詢

DELETE Reserations 
    FROM Reserations R 
    WHERE clientID NOT IN (SELECT clientID FROM Reserations WHERE CREDIT_CARD IS NOT NULL)   

,其中信用卡爲null,則更新所有的預約,由信用卡是可用於付費預訂,使用以下查詢

UPDATE Reserations 
SET CREDID_CARD = (SELECT TOP(1) CREDIT_CARD 
        FROM Reserations R1 
        WHERE R1.ClientId = R.ClientId 
         AND R1.CREDID_CARD IS NOT NULL) 
FROM Reserations R 
WHERE CREDID_CARD IS NULL 
+0

上帝非常感謝!這似乎工作得很好。我能問你一件事嗎 ?當你說Reserations R時,這意味着R是重置權? (如果我沒有弄錯,重命名)和top(1)是?提前致謝。 – KostasRim

+0

R僅僅是預約的別名,在第二個查詢中,它用於與內部查詢進行連接。 TOP(1)將返回包含該客戶信用卡信息的單行。你必須在這裏使用TOP(1),否則更新拋出錯誤,如果客戶有多個記錄與credit_card不爲空 –

+0

我的朋友,感謝解釋它真的幫助我! Ps想重創,但我的聲望低於15 :( – KostasRim