拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 选择两列时,洗掉查询不起作用

选择两列时,洗掉查询不起作用

白鹭 - 2022-01-25 2103 0 0
create table demo11 (dn int, rn varchar(max))
insert into demo11 values(1,'A'),(1,'A-1'),(1,'A-3'),(2,'A'),(2,'B'),(2,'C'),(3,'A-3'),(3,'A-4')
域名
1 一个
1 A-1
1 A-3
2 一个
2
2 C
3 A-3
3 A-4

预期结果:

域名
1 A-3
2 C
3 A-4

尝试使用以下查询但没有奏效:

delete from demo11 
where DN NOT in (1,2,3) AND RN NOT IN ('A-3','C','A-4') 

uj5u.com热心网友回复:

我认为您不需要洗掉,只需使用视窗功能例如ROW_NUMBER()

SELECT dn, rn
  FROM
  (
   SELECT ROW_NUMBER() OVER (PARTITION BY dn ORDER BY rn DESC) AS rnum,
          d.* 
     FROM demo11 AS d 
  ) AS dd
 WHERE rnum = 1 

如果您坚持洗掉这些值,则再次使用视窗函式,例如

WITH t AS
(
 SELECT dn AS dn2, rn AS rn2
   FROM
   (
    SELECT ROW_NUMBER() OVER (PARTITION BY dn ORDER BY rn DESC) AS rnum,
           d.* 
      FROM demo11 AS d 
   ) AS dd
  WHERE rnum > 1 
)
DELETE 
  FROM demo11
 WHERE EXISTS ( SELECT 1 FROM t WHERE rn=rn2 AND dn=dn2)

Demo

uj5u.com热心网友回复:

首先,定义您想要保留的记录,例如每个 DN 的最大 RN

SELECT dn, max(rn) rn_max from demo11 group by dn

然后,从洗掉中排除这些记录:

DELETE FROM demo11 d   
    LEFT JOIN ( SELECT dn, max(rn) rn_max from demo11 group by dn ) tmp
    ON d.dn = tmp.dn AND d.rn = tmp.rn_max
    WHERE tmp.dn is null

uj5u.com热心网友回复:

它不是那样作业的,即使只是在基本的资料集方面也是如此。这是一个更简单的例子:

John, Chicago
John, New York
Jane, Chicago

我想要所有不是来自芝加哥的约翰的行。这意味着我想要约翰/纽约和简/芝加哥。

如果我说name <> 'John' and city <> 'Chicago'我排除一切。简会被保留,因为她的名字不是约翰,但她的城市是芝加哥,而不是“非芝加哥”。这与说相同name NOT IN ('John') and city NOT IN ('Chicago')- 这里的核心问题是您试图将“John from Chicago”作为一对值排除在外,但是这两个子句 (1: name <> 'John', 2: city <> 'Chicago')不能一起使用-不要保留价值观在一起某些行被排除是因为它们是John,其他行被排除是因为它们是Chicago- 没有任何John Chicago关于此的值对的概念

真正想要的是NOT(name = 'John' AND city = 'Chicago'). 在这种情况下,资料保持配对。John/Chicago 作为子句保持在一起,NOT 对它们进行操作。这与由于一件事而被排除的某些行和因另一件事而被排除的其他行非常不同

一些数据库允许在 NOT IN 中有多个值,因此它们也允许像这样的结构:

(name, city) NOT IN ('John, 'Chicago')

John/Chicago 的配对再次保持在一起并协同作业以仅排除其中值为 John/Chicago 的一行


其他答案已经为您提供了您需要使用的 SQL,但我想谈谈为什么您的尝试不起作用你需要自己去体会,你的两个真话陈述DN NOT in (1,2,3)NOT IN ('A-3','C','A-4')单独作业并影响不同的行。根本没有任何东西可以将两个 IN 中的值保持在一起。如果您的数据库有:

(DN, RN) NOT IN ( (1,'A-3'), (2,'C'), (3,'A-4') )

然后它就可以解决了,因为那些 DN/RN 对保持在一起。如果您没有这样作业的数据库,那么您必须使用更像这样的东西:

NOT (
  (DN=1 AND RN='A-3') OR (DN=2 AND RN='C') OR (DN=3 AND RN='A-4')
)

这些还可以将您正在寻找的资料对“放在一起”,因为它是this and thatthis2 and that2this3 and that3(不是)

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *