微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何获取具有映射到的部件 ID 而没有来自部件级别 0 的同一部件的映射?

如何解决如何获取具有映射到的部件 ID 而没有来自部件级别 0 的同一部件的映射?

如何获取零件级别为 0 且没有地图的零件 ID?

我使用 sql Server 2012 并面临以下问题:我无法获取具有映射到的部件,但对于部件级别为 0 的同一部件,我无法获取其映射。

  • 如果零件的代码类型为 1273200,则零件级别 0 的代码类型必须为 974451。

  • 如果零件的代码类型为 194480,则零件级别 0 的代码类型必须为 7320911。

所以我需要显示

  • 代码类型为 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

正确的结果必须如下:

Parts That Have Map to and not have Map from

解决方法

解决方案

  1. 选择第 0 级的行 (c1)...
    c1.PartLevel = 0
  2. ...并过滤 to 行。
    c1.CodeTypeId in (194480,1273200)
  3. 对应的行 (c2)...
    where c2.PartId = c1.PartId and c2.PartLevel = c1.PartLevel
  4. ...一定是不见了...
    where not exists (...)
  5. ...链接在固定的 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 举报,一经查实,本站将立刻删除。