从查询中删除双连接结果

时间:2009-05-28 23:32:24

标签: sql tsql

我有一个查询,我自己加入一个表来查找零件高度或宽度之间的不匹配。唯一的问题是,由于这个连接,它将为每个部分返回两次未命中匹配。我只想为每次未命中比赛返回一行,而不是两次。

这是表格:

tblTagGlass
JobID varchar
UnitCode varchar
PartCode varchar
PartQty int
TagHeight float
TagWidth float

和查询:

select *
from tblTagGlass ttg
inner join tblTagGlass ttgC ON
ttg.JobID = ttgC.JobID
AND ttg.PartCode = ttgC.PartCode
where ttg.TagHeight != ttgC.TagHeight
or ttg.TagWidth != ttgC.TagWidth
order by ttg.PartCode

和结果:

INC375 U2-052 VT2-011 1 2013   1444.5   INC375 U2-028 VT2-011 1 2012.5 1444.5
INC375 U2-028 VT2-011 1 2012.5 1444.5   INC375 U2-052 VT2-011 1 2013   1444.5

我希望这是有道理的......

3 个答案:

答案 0 :(得分:1)

尝试

select *
from tblTagGlass ttg
inner join tblTagGlass ttgC ON
ttg.JobID = ttgC.JobID
AND ttg.PartCode = ttgC.PartCode
where (ttg.TagHeight != ttgC.TagHeight OR ttg.TagWidth != ttgC.TagWidth)
AND ((ttg.TagHeight >= ttgC.TagHeight AND ttg.TagWidth >= ttgC.TagWidth) 
    OR (ttg.TagHeight > ttgC.TagHeight AND ttg.TagWidth < ttgC.TagWidth))
order by ttg.PartCode

区别在于使用&gt;比较它们而不是!=

答案 1 :(得分:1)

让我们做一个假设:

  • PRIMARY KEY(JobCode,UnitCode,PartCode)

您正在寻找的是具有相同JobCode和PartCode但具有不同UnitCode值的项目 - 并且TagHeight或TagWidth(或两者)都有所不同。所以,使用'&gt;' UnitCode上的技巧可以区分行并防止重复,但'!='可以检测TagHeight或TagWidth中的差异:

SELECT *
    FROM tblTagGlass ttg JOIN tblTagGlass ttgC
         ON  ttg.JobID = ttgC.JobID
         AND ttg.PartCode = ttgC.PartCode
         AND ttg.UnitCode > ttgC.UnitCode
    WHERE (ttg.TagHeight != ttgC.TagHeight
       OR ttg.TagWidth != ttgC.TagWidth)
    ORDER BY ttg.PartCode

答案 2 :(得分:-1)

问题变成了,您想从行中获取哪些信息。它们是不同的行。

如果您只想要零件代码,这将有效:

select ttg.PartCode
from tblTagGlass ttg
inner join tblTagGlass ttgC ON
ttg.JobID = ttgC.JobID
AND ttg.PartCode = ttgC.PartCode
where ttg.TagHeight != ttgC.TagHeight
or ttg.TagWidth != ttgC.TagWidth
group by ttg.PartCode
order by ttg.PartCode

除此之外,您还需要确定跨行所需的信息汇总。