【问题标题】:IF NOT EXISTS INSERT ELSE UPDATE Avoiding Duplicates using 3 TablesIF NOT EXISTS INSERT ELSE UPDATE 避免重复使用 3 个表
【发布时间】:2016-08-18 00:18:52
【问题描述】:

我又是新手。我再说一遍,因为我第一次介绍 SQL 是在 1992 年在 AS400 上。

我知道有一些类似的帖子。我试图从每个人那里得到想法来解决我的问题,但几乎没有成功。这是我想要做的。有3张桌子。两个源表和一个目标表。源表是Tickets 和TicketEntities,目标表是DelTimes。

Tickets 有列:

(Id (primary), TicketNumber, LastUpdateTime and LastOrderDate, DepartmentId)

TicketEntities 有列:

(Ticket_Id, EntityTypeId, EntityName)

目标表DelTimes有:

(TicketId, TicketNo, TicketDate, LOTime, LOMinutes, DriverNam)

lastOrderDateLastUpdateTime 是日期和时间的组合,我必须从使用 convert 中提取信息。

这是迄今为止我遇到的错误多部分标识符问题。

IF EXISTS (SELECT * FROM Tickets, TicketEntities Where Tickets.DepartmentId = 2 and EntityTypeId = 3)
    UPDATE DelTimes
            SET TicketId =Tickets.Id, 
                DelTimes.TicketNo = Tickets.TicketNumber, 
                DelTimes.TicketDate = CONVERT(Date,Tickets.LastOrderDate,5),
                DelTimes.LOTime = Convert(datetime,Tickets.LastOrderDate,8), 
                DelTimes.LOMinutes = DATEDIFF(minute,Tickets.LastOrderDate,Tickets.LastUpdateTime),
                DelTimes.DriverNam = TicketEntities.EntityName
ELSE
    INSERT INTO DelTimes (TicketId, TicketNo, TicketDate, LOTime, LOMinutes, DriverNam)
                         VALUES (Id, TicketNumber, CONVERT(Date,LastOrderDate,5), 
                         Convert(datetime,LastOrderDate,8),
                         DATEDIFF(minute,LastOrderDate,LastUpdateTime),
                                      EntityName)

感谢您帮助解决这个问题!

【问题讨论】:

  • 格式代码。更多的人会尝试并提供帮助。
  • 看起来不像其他帖子是怎么做到的?
  • 有 4 个空格。我会帮你编辑的。
  • 我认为您缺少用于更新的WHERE 子句,还是要编辑目标表的所有条目?您不应该查看目标表中是否存在该条目来决定是更新还是插入?
  • 推荐学习 MERGE 语句——它确实会简化你的代码并使你的代码更具可读性。 technet.microsoft.com/en-us/library/bb522522(v=sql.105).aspx

标签: sql sql-server not-exists


【解决方案1】:

不是说这是答案,因为您没有变量、表之间的连接或 WHERE 子句。但对于刚开始的人来说,它可能最终看起来像这样:

     UPDATE DelTimes
                SET DelTimes.TicketNo = Tickets.TicketNumber, 
                    DelTimes.TicketDate = CONVERT(Date,Tickets.LastOrderDate,5),
                    DelTimes.LOTime = Convert(datetime,Tickets.LastOrderDate,8), 
                    DelTimes.LOMinutes = DATEDIFF(minute,Tickets.LastOrderDate,
Tickets.LastUpdateTime),
                    DelTimes.DriverNam = @DriverName
        FROM DelTimes
        JOIN Tickets ON DelTimes.TicketId = Tickets.TicketId
        JOIN TicketEntities ON TicketEntities.Ticket_Id =  Tickets.TicketId 
        WHERE DelTimes.TicketId = @TicketId
              AND TicketEntities.EntityTypeId = 3


    IF @@ROWCOUNT = 0
        INSERT INTO DelTimes (TicketId, TicketNo, TicketDate, LOTime, LOMinutes, DriverNam)
             VALUES (@TicketId, @TicketNumber, CONVERT(Date,@LastOrderDate,5), 
                Convert(datetime,@LastOrderDate,8),
                DATEDIFF(minute,@LastOrderDate,@LastUpdateTime),  
                @DriverName) 

我在这里可能弊大于利,他们对此有很多我不喜欢的地方,但这会让你开始。 (到下一轮问题。)

【讨论】:

    猜你喜欢
    • 2014-04-27
    • 1970-01-01
    • 2012-09-08
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    • 2019-07-29
    • 2013-11-26
    • 1970-01-01
    相关资源
    最近更新 更多