将Group By用作where子句的一部分

时间:2019-11-11 14:46:23

标签: sql sql-server

我正在尝试使用SQL Server从数据集中消除某些记录。我的帖子标题可能不准确,因为可能存在比我的想法更好的解决方案。

在我的查询中,我从表A中进行选择,并且要结束的行应满足以下条件:

  1. 其中A.ItemNumber = B.ItemNumber的所有行
  2. 所有行,其中A.ItemNumber <> B.ItemNumber并且该行的Task值没有满足条件#1的另一行。

因此对于以下示例:

  1. 为我们提供ItemNumber 102、104、106行。

  2. 为我们提供ItemNumber 105行。 将100、101从数据集中删除,因为它们的任务(1)与表B的项目编号为102。与103相同,任务(2)与表B的项目编号为104。

Table A
Task    ItemNumber
1          100
1          101
1          102
2          103
2          104
3          105
4          106

Table B
ItemNumber       Data
102              aaa
104              bbb
106              ccc

我最初的想法是将表A装入临时表,与表B左连接,并在{临时表}的位置删除(数据为空,{在此处插入某种分组逻辑})。但是我一直无法弄清楚可以解决该问题的分组逻辑。我花了整个周末,希望能找到解决方案,但现在我正在寻求帮助。

3 个答案:

答案 0 :(得分:1)

SELECT *
FROM TABLEA AS A
LEFT JOIN TABLEB AS B ON A.ItemNumber = B.ItemNumber
WHERE B.ItemNumber IS NOT NULL -- critera 1
  OR  (B.ItemNumber IS NULL AND B.ItemNumber NOT IN
           (SELECT A.ItemNumber 
            FROM TABLEA AS A
            JOIN TABLEB AS B ON A.ItemNumber = B.ItemNumber)) -- criteria 2

答案 1 :(得分:1)

表达这种情况的一种方法是将所有过滤逻辑放在org.eclipse.persistence.dynamic.DynamicClassWriter.createEnum(EnumInfo)子句中:

where

答案 2 :(得分:1)

使用满足第一个条件的CTE并使用UNION ALL返回其余行:

with cte as (
  select a.*
  from TableA a
  where exists (select 1 from TableB where ItemNumber = a.ItemNumber)
)
select * from cte
union all
select a.* from TableA a
where not exists (select 1 from cte where Task = a.Task)
order by Task

请参见demo
结果:

Task    ItemNumber
1       102
2       104
3       105
4       106