2009-05-28 45 views
1

我有一個查詢,我在其中加入一個表以查找零件高度或寬度之間的不匹配。唯一的問題是,因爲這個連接,每個部分都會返回兩次錯過匹配。我只想爲每次錯過比賽返回一行,而不是兩次。從查詢中刪除雙連接結果

這裏的表:

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 

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

回答

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 

的區別是使用>給他們,而不是比較!=

+0

謝謝,這個工作真的很好! – Noah 2009-05-28 23:45:00

+0

在這種情況下效果很好,是的。但是,在其他情況下,它不會 - 例如高度不相等。因此,快速解決方案是將其設爲「>」。但是,如果一行的高度更大,但寬度更小 - 你會馬上回到你開始的地方。查看我的答案以獲得解決方案。 – TheSoftwareJedi 2009-05-28 23:54:49

-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 

除此之外,你需要決定你想要跨行什麼的聚集信息。

1

讓我們做一個假設:

  • PRIMARY KEY(JOBCODE,UnitCode,PartCode)

你所尋找的是具有相同JOBCODE和PartCode但不同UnitCode值的項目 - 和在TagHeight或TagWidth(或兩者)中有所不同。因此,在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