Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server T-SQL不工作,但不存在_Sql Server_Tsql_Not Exists - Fatal编程技术网

Sql server T-SQL不工作,但不存在

Sql server T-SQL不工作,但不存在,sql-server,tsql,not-exists,Sql Server,Tsql,Not Exists,随着新记录添加到表中,我需要将该“级别”的旧记录标记为旧记录。我可以用一个NOT IN来做这件事,但NOT EXISTS不起作用。我怀疑这与子查询相关性有关,如下所述: 但我不明白为什么&需要进一步解释。下面是一些示例代码: CREATE TABLE t2 (id INT, level INT, someDate datetime, mostRecent int) GO INSERT INTO t2 SELECT 1, 1, '1/1/2010', 1 UNION ALL SELECT 2, 1

随着新记录添加到表中,我需要将该“级别”的旧记录标记为旧记录。我可以用一个NOT IN来做这件事,但NOT EXISTS不起作用。我怀疑这与子查询相关性有关,如下所述: 但我不明白为什么&需要进一步解释。下面是一些示例代码:

CREATE TABLE t2 (id INT, level INT, someDate datetime, mostRecent int)
GO
INSERT INTO t2
SELECT 1, 1, '1/1/2010', 1 UNION ALL
SELECT 2, 1, '2/2/2010', 1 UNION ALL
SELECT 3, 2, '3/3/2010', 1 UNION ALL
SELECT 4, 3, '4/4/2010', 1 UNION ALL
SELECT 5, 3, '5/5/2010', 1 UNION ALL
SELECT 6, 3, '6/6/2010', 1 UNION ALL
SELECT 7, 4, '7/7/2010', 1 UNION ALL
SELECT 8, 5, '8/8/2010', 1 UNION ALL
SELECT 9, 6, '9/9/2010', 1 UNION ALL
SELECT 10, 6, '10/10/2010', 1 UNION ALL
SELECT 11, 8, '11/11/2012', 1
GO
-- this doesn't work
UPDATE t2 SET mostRecent = 0
FROM t2
WHERE NOT EXISTS
    (SELECT * FROM t2
    JOIN
        (SELECT level, max(someDate) as someDate FROM t2 group by level) as maxrows
    ON t2.someDate = maxrows.someDate)
GO
-- this works
UPDATE t2 SET mostRecent = 0
FROM t2
WHERE id NOT IN
    (SELECT t2.id FROM t2
    JOIN
        (SELECT level, max(someDate) as someDate FROM t2 group by level) as maxrows
    ON t2.someDate = maxrows.someDate)

您的查询错误,需要:

UPDATE T SET mostRecent = 0
FROM t2 as T
WHERE NOT EXISTS
    (SELECT * FROM 
     (SELECT level, max(someDate) as someDate FROM t2 group by level) as maxrows
      WHERE T.someDate = maxrows.someDate)
我已将alias添加到表中以保持清晰


在原始查询中,您没有将
not EXISTS
查询中的任何内容链接到
UPDATE
语句,因此它将始终返回结果,并且对于要更新的表中的每个记录,它都将“存在”。

您可以将整个查询重写到此语句以获得更好的性能,Joao的脚本应该已经修复了您描述的错误:

;WITH CTE as
(
  SELECT
    mostrecent, 
    row_number() over (partition by level order by somedate desc) rn
  FROM t2
)
UPDATE CTE
SET 
  mostrecent = 0
WHERE 
  mostrecent = 1
  and rn > 1

在我看来,这是一个有缺陷的更新。如果你有一个SELECT 2,1,“4/4/2010”,1 UNION ALL,那么它会找到ID 4也谢谢你!我怀疑子查询与更新没有正确关联;我需要在公共表表达式、XML路径、CLR程序集和。。。列表如下。@t-clausen.dk使用CTE或使用更新之间是否有性能优势。。。FROM(使用FROM子句中的表)?@JoaoLeal这两种方法都通过使用此方法使用更新。我避免在subselect中使用subselect,它还具有更好的可读性和更新更少的行。是的,它将执行得更快。我已经创建了一个新问题: