Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从查询中删除双连接结果_Sql_Tsql - Fatal编程技术网

Sql 从查询中删除双连接结果

Sql 从查询中删除双连接结果,sql,tsql,Sql,Tsql,我有一个查询,我将一个表连接到它本身,以查找零件高度或宽度之间的不匹配。唯一的问题是,由于这种连接,它将为每个零件返回两次未匹配的结果。我只想为每一场错过的比赛返回一行,而不是两行 这是桌子: tblTagGlass JobID varchar UnitCode varchar PartCode varchar PartQty int TagHeight float TagWidth float 以及查询: select * from tblTagGlass ttg inner join tb

我有一个查询,我将一个表连接到它本身,以查找零件高度或宽度之间的不匹配。唯一的问题是,由于这种连接,它将为每个零件返回两次未匹配的结果。我只想为每一场错过的比赛返回一行,而不是两行

这是桌子:

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
我希望这是有意义的…

试试看

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
选择*
从TBLTG到ttg
内部连接TBLTAGGCASS ttgC ON
ttg.JobID=ttgC.JobID
和ttg.PartCode=ttgC.PartCode
其中(ttg.TagHeight!=ttgC.TagHeight或ttg.TagWidth!=ttgC.TagWidth)
和((ttg.TagHeight>=ttgC.TagHeight和ttg.TagWidth>=ttgC.TagWidth)
或者(ttg.TagHeight>ttgC.TagHeight和ttg.TagWidth
区别在于使用>来比较它们,而不是=

试试看

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
选择*
从TBLTG到ttg
内部连接TBLTAGGCASS ttgC ON
ttg.JobID=ttgC.JobID
和ttg.PartCode=ttgC.PartCode
其中(ttg.TagHeight!=ttgC.TagHeight或ttg.TagWidth!=ttgC.TagWidth)
和((ttg.TagHeight>=ttgC.TagHeight和ttg.TagWidth>=ttgC.TagWidth)
或者(ttg.TagHeight>ttgC.TagHeight和ttg.TagWidth

区别在于使用>来比较它们,而不是=

问题变成,您希望从行中获得哪些信息。它们是不同的行

如果您只需要零件代码,这将起作用:

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

除此之外,您还需要决定希望跨行聚合哪些信息。

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

如果您只需要零件代码,这将起作用:

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

除此之外,您还需要决定要跨行聚合哪些信息。

让我们假设:

  • 主键(作业代码、单位代码、零件代码)
您要查找的是具有相同作业代码和零件代码但具有不同单位代码值的项目,并且标记高度或标记宽度(或两者)存在差异。因此,在UnitCode上使用“>”技巧来区分行并防止重复,但是“!=”要检测标记高度或标记宽度的差异:

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

让我们做一个假设:

  • 主键(作业代码、单位代码、零件代码)
您要查找的是具有相同作业代码和零件代码但具有不同单位代码值的项目,并且标记高度或标记宽度(或两者)存在差异。因此,在UnitCode上使用“>”技巧来区分行并防止重复,但是“!=”要检测标记高度或标记宽度的差异:

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

我想要单位代码、零件代码、高度和宽度不匹配如果它们不匹配,您想要哪个高度/宽度?你的逻辑有点缺陷……我喜欢被投票否决,因为它提供了正确的答案。愿上帝保佑你。lolI想要单位代码、零件代码、高度和宽度不匹配如果它们不匹配,您想要哪个高度/宽度?你的逻辑有点缺陷……我喜欢被投票否决,因为它提供了正确的答案。愿上帝保佑你。在这种情况下,Lol工作得很好,是的。然而,在其他情况下,它不会-例如,如果高度不相等。因此,快速解决方案是将其也设为“>”。但是,若一行的高度更高,但宽度更小,你们就会回到你们开始的地方。请参阅我的答案以获得解决方案。据我所知,该问题仍然有效,返回了一个示例(在SQL server语法中),其中包含valA和valB差异创建表测试(PK int identity(1,1)、KeyVal int、valA int、valB int)插入测试值(1,1,1)插入测试值(1,1)插入测试值(2,1,1)插入测试值(2,2,1)插入测试值(3,1,2)插入测试值(3,1,1)插入测试值(4,1,2)插入测试值(4,2,1)插入测试值(5,2,1)插入测试值(5,1,2)从测试A中选择*在A.valA B.valA和A.valB>B.valB和A.KeyVal=B上连接测试B。KeyVal@Tetraneutron-他正在寻找宽度或高度不同的零件。您的SQL在联接中具有AND。将其更改为OR。我认为这是正确的,检查它们是否不同的检查中有OR,然后将其限制为每差一行,检查第一个表是否>=两列的第二个表(通过前面的检查,至少会有一列)-当然,如下面所述,如果您有一些键字段(例如候选键(唯一))这与>相当,你可以使用它(因为只有大于比较(在这种情况下,你不会使用>=)在这种情况下效果很好,是的。但是,在其他情况下,它不会很好-例如,如果高度不相等。所以快速解决方案是将其设为“>”还有。但是,如果一行的高度更高,但宽度更小,您将回到您开始的位置。请参阅我的答案以获得解决方案。据我所知,它仍然可以解决问题,例如(在SQL server语法中)返回的Keyvals 4和5都具有valA和valB差异创建表测试(PK int identity(1,1))插入测试值(1,1,1)插入测试值(2,1,1)插入测试值(2,2,1)插入测试值(3,1,2)插入测试值(3,1,2)插入测试值(3,1,1)插入测试值(4,1,2)插入测试值(4,2,1)插入测试值(5,2,1)插入测试值(5,1,2)从测试A中选择*在A.valA B.valA和A.valB>B.valB和A.KeyVal=B上连接测试B。KeyVal@Tetraneutron-他正在寻找宽度或高度不同的零件。您的SQL在联接中有AND。将其更改为OR。我认为这是正确的,检查它们是否不同,然后限制It每差一行