X& Y更新场景

时间:2018-06-18 11:47:37

标签: sql-server sql-server-2008

Data1
+++++++++++++++++
|Name    | Grade|
++++++++++++++++
|Tom     |  A   |
|NULL    |  B   |
|Bill    |  NULL|
+++++++++++++++++

让我们说,我有一个表“Data1”如上所述。 我编写了一个动态查询,它将从Data1中为Name和Grade Columns检索NOT NULL值。

DECLARE @Query nvarchar(255)
SET @Query = SELECT * from Data1 WHERE Name IS NOT NULL AND Grade IS NOT NULL

执行@query

EXECUTE sp_executesql @Query

我应该得到结果:

+++++++++++++++++
|Name    | Grade|
++++++++++++++++
|Tom     |  A   |
+++++++++++++++++

是否有可能以这样的方式编写@query,即使用执行@Query的结果更新Data1,即:table Data1仅保存此值

Updated Data1 table
+++++++++++++++++
|Name    | Grade|
++++++++++++++++
|Tom     |  A   |
+++++++++++++++++

在其中继续并删除其余部分,是否可能?

我知道一个选项是写入另一个表,然后根据该表的值更新Data1,但我只是想知道是否有更有效的更新表的方法:Data1 没有创建更多的表?

感谢。

2 个答案:

答案 0 :(得分:0)

声明,你在这里是:

DELETE FROM Data1
WHERE [Name] IS NULL
   OR Grade IS NULL;

此查询没有理由是动态的。不过,我有这种感觉,这可能是一个xy问题。

答案 1 :(得分:0)

您也可以使用NOT EXISTS代替:

DELETE d 
FROM Data1 d
WHERE NOT EXISTS (SELECT 1 
                  FROM Data1 d1
                  WHERE d1.NAME = d.NAME AND d1.GRADE = d.GRADE AND 
                        d1.NAME IS NOT NULL AND d1.GRADE IS NOT NULL
                 )
GO

SELECT *
FROM Data1 d;