【问题标题】:SQL Server WITH clause, how to add additional condition?SQL Server WITH 子句,如何添加附加条件?
【发布时间】:2020-08-31 11:30:45
【问题描述】:

关于本帖及回复:https://stackoverflow.com/a/1389653/9343200

我要做的是在表 Paragony 中查找缺失的 ID,然后我必须再检查一列:par_nrkasy,如果它是 =1 或 =2。

我正在尝试再添加一个条件WHERE par_nrkasy = ,但我不知道如何添加到这个查询中,我的意思是,让它工作并保持主代码的含义。

我的代码:

;WITH Missing (missnum, maxid) AS 
(
    SELECT 
        1 AS missnum,
        (SELECT MAX(par_numerf) 
         FROM Paragony) 
    UNION ALL 
    SELECT missnum + 1, maxid 
    FROM Missing 
    WHERE missnum < maxid
)
SELECT missnum 
FROM Missing 
LEFT OUTER JOIN Paragony tt ON tt.par_numerf = Missing.missnum 
WHERE tt.par_numerf is NULL 
OPTION (MAXRECURSION 0);

有什么想法吗?我尝试过的任何东西都会得到错误的结果,例如重复或根本没有结果

或者我可以通过这段代码使用它,但问题是如何添加子句

SELECT DISTINCT par_numerf + 1
FROM Paragony
WHERE par_numerf + 1 NOT IN (SELECT DISTINCT par_numerf FROM Paragony);

【问题讨论】:

  • 在您的问题中提供样本数据和期望的结果。它应该独立存在,无需通过链接引用。只是要明确一点:在您的问题或您所指的问题中都没有par_nrkasy,所以您想做的就是莫名其妙。
  • Tally 表解决方案在 Stack Overflow 上不受欢迎,但这就是它所需要的。
  • 在开始编写代码之前,最简单的事情就是搜索互联网。您需要从 1 到由查询确定的某个上限的数字顺序列表吗?很好 - 搜索numbers table
  • 接下来,学会提出聪明的问题。诸如“不起作用”和“错误结果”之类的短语对除您之外的任何人都没有意义。您的源数据的实际示例以及您希望从基于您的示例的查询中得到什么有助于其他人了解您的目标。
  • 谢谢,基本上我正在做的事情是在 DB“缺失”ID 中找到,如下所示:imgur.com/U944wBB,但问题是我必须添加额外的包含条件来检查另一列 par_nrkasy 如果它是 1或 2,因为在 1 上此字段中没有缺少 id,但在 2 上是

标签: sql-server conditional-statements common-table-expression


【解决方案1】:

也许你可以试试这样的:

;WITH Missing (missnum, maxid) AS (
SELECT 1 AS missnum, (
    SELECT MAX(par_numerf) 
    FROM Paragony) 
UNION ALL 
SELECT missnum + 1, maxid 
FROM Missing 
WHERE missnum < maxid) 
SELECT missnum 
FROM Missing 
LEFT OUTER JOIN Paragony tt 
ON tt.par_numerf = Missing.missnum 
WHERE tt.par_numerf is NULL 
OR tt.par_nrkasy = 2 
OPTION (MAXRECURSION 0);

【讨论】:

  • 然后我得到 0 个结果,它应该显示至少一个 par_numerf = 175 ,就像你在这里看到的那样,它缺少 ID (numerf) 175:imgur.com/U944wBB
  • 应该已经从 where 子句 tt.par_numerf 为 NULL 中过滤了字段 par_numerf 的值不同于 NULL 的记录。在谈到附加条件时,您是在谈论 OR 还是 AND 条件?
  • 问题是我必须添加这个条件,因为在我的数据库中,当我不检查 par_nrkasy 是 1 还是 2 时,它不会显示该行在 db 中不存在,因为例如,当我在没有此条件的情况下进行选择时,它并没有告诉我这个 id (175) 在 par_nrkasy = 1 上缺少 bc 它存在,但是在 par_nrkasy = 2 NOT 中,我必须考虑它,不知道它应该如何条件虽然
  • 如果我理解正确,您希望查询从“缺失”记录中返回每个 id,或者 par_nrkasy 中的值等于 2 的记录?
  • 我想要返回所有“缺失”ID(par_numerf)的查询,但这就是为什么我需要包含此列(par_nrkasy),因为没有它,它可能是我上面描述的情况,它没有显示"missing" id bc 它包含在 par_nrkasy = 1 中,但它在 par_nrkasy = 2 中丢失
【解决方案2】:

函数 fnTally 可以在here 找到。像这样的

;with max_min_cte(max_par_numerf, min_par_numerf) as (
    select max(par_numerf), min(par_numerf)
    from Paragony)
select f.N 
from max_min_cte mmc 
     cross apply dbo.fnTally(1, mmc.max_par_numerf) f
except
select par_numerf 
from Paragony
where par_nrkasy in(1,2);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-28
    • 2021-02-27
    • 1970-01-01
    • 2019-06-26
    • 2011-02-10
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多