2014-06-19 35 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