自引用查询和不等于

时间:2016-07-30 23:25:10

标签: sql ms-access

尝试从名为tblTooling的单个表中提取数据,其中两个TlPartNo数字等于不同的值,并且TlToolNo对于这些TlPartNo不相等。这是一个Access DB,以下语句使我接近,但仍然提供了太多的数据。

SELECT DISTINCT 
   tblTooling.TlToolNo, 
   tblTooling.TlPartNo, 
   tblTooling.TlOP, 
   tblTooling.TlQuantity
FROM tblTooling, tblTooling AS tblTooling_1
WHERE (((tblTooling.TlToolNo)<>tblTooling_1.TlToolNo) 
 AND ((tblTooling.TlPartNo)="10290722") 
 AND ((tblTooling_1.TlPartNo)="10295379"));

包含的图像具有tblTooling结构和数据。加上查询的预期结果。 image

2 个答案:

答案 0 :(得分:0)

当您使用 PartNo 值时,您似乎想要排除 ToolNo 值。在这种情况下,您可以通过 ToolNo 对中间结果进行分组,并查看在这样的组中是否只有一个 PartNo (使用canvas.clip{whatever}(rect/region/path, op). )。在这种情况下,保留该记录,并在外部查询中,获取添加到其中的另外两列:

having

请注意,对于您的示例数据,这将返回4行:

SELECT DISTINCT 
            tblTooling.TlToolNo, 
            tblTooling.TlPartNo, 
            tblTooling.TlOP, 
            tblTooling.TlQuantity
FROM        tblTooling
INNER JOIN (
            SELECT    TlToolNo,
                      Min(TlPartNo) AS MinTlPartNo,
                      Max(TlPartNo) AS MaxTlPartNo
            FROM      tblTooling
            WHERE     TlPartNo IN ("10290722", "10295379")
            GROUP BY  TlToolNo
            HAVING    Min(TlPartNo) = Max(TlPartNo)
           ) AS grp
        ON  grp.TlToolNo = tblTooling.TlToolNo
       AND  grp.MinTlPartNo = tblTooling.TlPartNo

答案 1 :(得分:0)

我认为您可以使用not exists执行此操作:

select t.*
from tblTooling as t
where not exists (select 1
                  from tblTooling as t2
                  where t2.TlPartNo in ("10290722", "10295379") and
                        t2.TlToolNo = t.TlToolNo and
                        t2.tiid <> t.tiid
                 ) and
      t.TlPartNo in ("10290722", "10295379");

这可以节省select distinct,这应该会提升效果。