如何解决如何获取具有映射到的部件 ID 而没有来自部件级别 0 的同一部件的映射?
如何获取零件级别为 0 且没有地图的零件 ID?
我使用 sql Server 2012 并面临以下问题:我无法获取具有映射到的部件,但对于部件级别为 0 的同一部件,我无法获取其映射。
所以我需要显示:
- 代码类型为 1273200 的部分
- 对于零件级别 0 并且没有来自 974451 的地图
或
- 代码类型为 194480 的部分
- 对于零件级别 0 并且没有来自 7320911 的地图
代码:
create table #codes
(
PartId int,CodeTypeId int,Partlevel int
)
insert into #codes (PartId,CodeTypeId,Partlevel)
values
---this is correct----
(1250,974451,0),---map from
(1250,1273200,---map to
(1250,7320911,194480,--map to
------------------
--where map from 974451 for part id 1900 for partlevel 0
(1900,---map to
(1900,---map from
(1900,--map to
------------------
(2200,---map from
(2200,---map to
--where map from 7320911 for part id 2200 for partlevel 0
(2200,--map to
-----------------
(3400,1),--where map from 974451 for part id 3400 for partlevel 0 so if 1 it is wrong
(3400,---map to
(3400,---map from
(3400,--map to
-----------------
--where map from 974451 for part id 3900 for partlevel 0 so if 1 then it is not exist
(3900,---map to
(3900,1997801,(3900,---map from
(3900,--map to
---------------
(5020,(5020,--where map from 7320911 for part id 5020 for partlevel 0 if 1 then it is not exist
(5020,--map to
------------------
---map from 974451 not exist for part id 7050 but not care because I need only parts have partlevel 0
(7050,---map to
(7050,---map from
(7050,--map to
-----------------
---map from 7320911 not exist for part id 8900 for partlevel 0 if part level 1 then not exist
(8900,---map from
(8900,--map to
-----------------
---map from 7320911 not exist for part id 9200 for partlevel 0
(9200,0) --map to
-----------------
我尝试的是
select partid,codetypeid from #codes
where partlevel=0 and codetypeid=974451 and codetypeid <> 1273200
group by partid,codetypeid
union all
select partid,codetypeid from #codes
where partlevel=0 and codetypeid=194480 and codetypeid <> 7320911
group by partid,codetypeid
正确的结果必须如下:
解决方法
解决方案
- 选择第 0 级的行 (
c1
)...c1.PartLevel = 0
- ...并过滤
to
行。c1.CodeTypeId in (194480,1273200)
- 对应的行 (
c2
)...where c2.PartId = c1.PartId and c2.PartLevel = c1.PartLevel
- ...一定是不见了...
where not exists (...)
- ...链接在固定的
from
/to
对上。and (c1.CodeTypeId <> 1273200 or c2.CodeTypeId = 974451)
and (c1.CodeTypeId <> 194480 or c2.CodeTypeId = 7320911)
第 5 步转换为以下伪代码:
if (c1.CodeTypeId = 1273200)
{
c2.CodeTypeId = 974451;
}
if (c1.CodeTypeId = 194480)
{
c2.CodeTypeId = 7320911;
}
结合一切:
select c1.PartId,c1.CodeTypeId,c1.PartLevel
from codes c1
where c1.PartLevel = 0
and c1.CodeTypeId in (194480,1273200) -- "to"
and not exists ( select 'x'
from codes c2
where c2.PartId = c1.PartId
and c2.PartLevel = c1.PartLevel
and (c1.CodeTypeId <> 1273200 or c2.CodeTypeId = 974451) -- "from" v1
and (c1.CodeTypeId <> 194480 or c2.CodeTypeId = 7320911) ); -- "from" v2
结果
PartId CodeTypeId PartLevel
------ ---------- ---------
1900 1273200 0
2200 194480 0
3400 1273200 0
3900 1273200 0
5020 194480 0
8900 194480 0
9200 194480 0
Fiddle 查看正在运行的所有内容。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。