【问题标题】:Subquery or Unions for adding more strict conditions?用于添加更严格条件的子查询或联合?
【发布时间】:2023-03-17 21:28:01
【问题描述】:

我要排除一些即将出现的行

我的代码:

SELECT DISTINCT T1.FILENUM, T5.OFG, T4.UN
FROM
T1
LEFT OUTER JOIN 
   T2 ON T1.ID=T2ID
LEFT OUTER JOIN 
   T3 ON T1.ID = T3.ID
LEFT OUTER JOIN 
   T4 ON T3.ID=T4ID
LEFT OUTER JOIN 
   T5 ON T2.ID = T5.ID
WHERE DATECondition
AND T1.FILENUM LIKE 'S%'
AND (T4.UN = 26 OR T4.UN = 25 OR T4.UN = 24 OR T4.UN = 32)

结果

FILENUM    OFG     UN
S1          S      26
S1          C      25
S1          D      26
S2          S      26
S2          S      24
S3          S      26
S4          S      26
S4          C      25
S5          S      32
S6          S      24
S7          S      25
S7          S      24

这些表格的意思是,有联合国用户和投诉路径的filenum记录的投诉。 OFG是投诉人。 UN 是路由 Filenums 的用户。

  1. 我想补充的是,只有当(OFG 不像 '[cd]%' 或 OFG 为 NULL)时,我还想确保对于一行:如果 OFG 是 C 或 D ,请排除所有行,即使它有 S。

  2. 我想扫描这些行并查看联合国。如果 UN 有 24 且 UN 也是 26 的 filenum 的计数等于或大于 2,则仅显示 un 为 26 的 filenum 行。结果是,我有一个主管用户始终在访问投诉,并且同一用户 (UN) 也仅单独处理投诉。我想表明,如果该主管用户与其他用户一起访问该案例,请不要包括他的行,因为他可能只是在阅读投诉。还有 3 个其他用户我想比较这个管理员用户。

另外一个例子,如果 sueprvisor 用户的 filenum 计数为 1,则在我的结果中包含该行。如果 un in (25, 24) 中的 filenum 的计数大于 2,则仅包括 un 为 25 的行。使用 un in (26, 24) 和 un in 重复此操作(32, 24)。

结果 2:

FILENUM    OFG     UN
S2          S      26    
S3          S      26
S5          S      32
S6          S      24
S7          S      25

【问题讨论】:

  • 您需要添加更多解释。 UN不可能同时等于24和26。帮助我们了解问题,我们可以帮助您解决问题。
  • @SeanLange 请阅读我尝试提供有关联合国的更多详细信息。
  • 考虑通过在 WHERE 子句中添加 AND NOT EXISTS() 来解决这个问题。
  • 另外,您可能会意识到,您的查询的编写方式已将所有左连接都变成了内连接。

标签: sql-server ssms ssms-2012


【解决方案1】:

试试这个。

CREATE TABLE #test1
  (FILENUM VARCHAR(50),OFG CHAR(1),UN INT)

INSERT #test1
VALUES ('S1','S',26),('S1','C',25),('S1','D',26),
       ('S2','S',26),('S2','S',24),('S3','S',26),
       ('S4','S',26),('S4','C',25),('S5','S',32),
       ('S6','S',24),('S7','S',25),('S7','S',24) 


WITH cte
     AS (SELECT Row_number()OVER(partition BY filenum ORDER BY un DESC) rn,
                *
         FROM   #test1
         WHERE  FILENUM NOT IN(SELECT FILENUM
                               FROM   #test1
                               WHERE  OFG IN ( 'C', 'D' )))
SELECT FILENUM,OFG,UN
FROM   cte
WHERE  rn = 1 

输出:

FILENUM OFG UN
------- --- --
S2      S   26
S3      S   26
S5      S   32
S6      S   24
S7      S   25

【讨论】:

  • 不幸的是,我正在从一个只有只读访问权限的数据库中提取数据,而且还有更多示例。
猜你喜欢
  • 2015-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多