我正在尝试使用SQL Server从数据集中消除某些记录。我的帖子标题可能不准确,因为可能存在比我的想法更好的解决方案。
在我的查询中,我从表A中进行选择,并且要结束的行应满足以下条件:
因此对于以下示例:
为我们提供ItemNumber 102、104、106行。
为我们提供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左连接,并在{临时表}的位置删除(数据为空,{在此处插入某种分组逻辑})。但是我一直无法弄清楚可以解决该问题的分组逻辑。我花了整个周末,希望能找到解决方案,但现在我正在寻求帮助。
答案 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