【问题标题】:Unable to make DELETE sql query无法进行 DELETE sql 查询
【发布时间】:2017-12-16 05:43:48
【问题描述】:

我无法通过 DELETE 查询删除表 [Inventory_Databases_Master] 中的额外行,如下所示:

SELECT SQLInstanceName,DatabaseName
FROM [AdminInventory].[dbo].[Inventory_Databases_Master]
where SQLInstanceName='SMLYNSQL01NOD01'

--返回 26 行
SMLYNSQL01NOD01 DB1
SMLYNSQL01NOD01 嗨
SMLYNSQL01NOD01 DB2
SMLYNSQL01NOD01 DB3
SMLYNSQL01NOD01 DB4
SMLYNSQL01NOD01 DB5
SMLYNSQL01NOD01 DB6
SMLYNSQL01NOD01 DB7
SMLYNSQL01NOD01 DB8
SMLYNSQL01NOD01 DB9
SMLYNSQL01NOD01 DB10
SMLYNSQL01NOD01 DB11
SMLYNSQL01NOD01 DB12
SMLYNSQL01NOD01 DB13
SMLYNSQL01NOD01 DB14
SMLYNSQL01NOD01 DB15
SMLYNSQL01NOD01 DB16
SMLYNSQL01NOD01 DB17
SMLYNSQL01NOD01 DB18
SMLYNSQL01NOD01 DB19
SMLYNSQL01NOD01 DB20
SMLYNSQL01NOD01 DB21
SMLYNSQL01NOD01 DB22
SMLYNSQL01NOD01 DB23
SMLYNSQL01NOD01 DB24
SMLYNSQL01NOD01 DB25

SELECT SQLInstanceName,DatabaseName
FROM [AdminInventory].[dbo].[Inventory_Databases_DailyUpdate] D
WHERE D.RunNumber=(SELECT MAX(RunNumber) from [Inventory_Databases_DailyUpdate])
and SQLInstanceName='SMLYNSQL01NOD01'

--返回 25 行
SMLYNSQL01NOD01 DB1
SMLYNSQL01NOD01 DB2
SMLYNSQL01NOD01 DB3
SMLYNSQL01NOD01 DB4
SMLYNSQL01NOD01 DB5
SMLYNSQL01NOD01 DB6
SMLYNSQL01NOD01 DB7
SMLYNSQL01NOD01 DB8
SMLYNSQL01NOD01 DB9
SMLYNSQL01NOD01 DB10
SMLYNSQL01NOD01 DB11
SMLYNSQL01NOD01 DB12
SMLYNSQL01NOD01 DB13
SMLYNSQL01NOD01 DB14
SMLYNSQL01NOD01 DB15
SMLYNSQL01NOD01 DB16
SMLYNSQL01NOD01 DB17
SMLYNSQL01NOD01 DB18
SMLYNSQL01NOD01 DB19
SMLYNSQL01NOD01 DB20
SMLYNSQL01NOD01 DB21
SMLYNSQL01NOD01 DB22
SMLYNSQL01NOD01 DB23
SMLYNSQL01NOD01 DB24
SMLYNSQL01NOD01 DB25

下面的 DELETE 查询正在删除 0 条记录。我需要删除以 DatabaseName 为 hi 的记录。

DELETE M
FROM Inventory_Databases_Master M
LEFT JOIN Inventory_Databases_DailyUpdate D (NOLOCK)
ON M.SQLInstanceName=D.SQLInstanceName
AND M.DatabaseName=D.DatabaseName
WHERE D.RunNumber=(SELECT MAX(RunNumber) from 
[Inventory_Databases_DailyUpdate])
AND D.DatabaseName IS NULL

请帮忙!

【问题讨论】:

  • 你能显示正在返回的记录吗?我在想这种情况AND D.DatabaseName IS NULL 导致了这个问题。由于您在上述任何一个查询中都没有。
  • 原始问题中的查询结果已更新。感谢您的宝贵时间。
  • 如果删除“AND D.DatabaseName IS NULL”,则所有 25 行都将从 Inventory_Databases_Master 中删除,剩下的唯一行是 DatabaseName 为“hi”。但是,我需要相反的是,这 25 行应该保留,并且只有“hi”行应该被删除。
  • 然后把AND D.DatabaseName is NULL改成AND D.DatabaseName = 'hi'

标签: sql-server tsql


【解决方案1】:

您的查询将找不到任何要删除的记录,因为如果 D.DatabaseNameNULL 那么 D.RunNumber 也将是 NULL

是不是你需要的:

DELETE M
FROM
    Inventory_Databases_Master M
    LEFT JOIN Inventory_Databases_DailyUpdate D (NOLOCK) ON
        M.SQLInstanceName = D.SQLInstanceName
        AND M.DatabaseName = D.DatabaseName
WHERE D.DatabaseName IS NULL

或者只检查最后一个RunNumber

DELETE M
FROM
    Inventory_Databases_Master M
    LEFT JOIN
        (
            SELECT
                SQLInstanceName
                , DatabaseName
            FROM Inventory_Databases_DailyUpdate D
            WHERE
                D.RunNumber =
                    (
                        SELECT MAX(RunNumber)
                        FROM [Inventory_Databases_DailyUpdate]
                    )
        ) D
    ON
        M.SQLInstanceName = D.SQLInstanceName
        AND M.DatabaseName = D.DatabaseName
WHERE D.DatabaseName IS NULL

【讨论】:

  • 首先谢谢。是的,使用 D.DatabaseName 作为 NULL 不会删除任何内容。没有这个,所有 25 行都会被删除,除了 DatabaseName "hi" 的行.....但是,我需要相反的是这 25 行应该保留并且只有 "hi" 行应该被删除。
  • 修改后的查询是否提供了您想要的内容?
  • 修改后的查询没有删除任何内容。
  • 如果您将其作为SELECT 尝试,这可能会揭示发生了什么 - 如果“hi”不在D 中,那么D.DatabaseName 应该是NULL
  • 第二次修改后的查询会从表中删除除这 25 行之外的所有内容。
猜你喜欢
  • 2013-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多