混合两个SQL查询:返回第一个请求但忽略第二个

时间:2017-10-24 11:32:45

标签: mysql sql merge inner-join

我有两个正常运行的查询:

SELECT DISTINCT MarcadaProduccio.Article, 
                SUM(MarcadaProduccio.Rendiment * MarcadaProduccio.HoresMarcada)/SUM(MarcadaProduccio.HoresMarcada) AS MitjanaPonderada 
FROM MarcadaProduccio 
INNER JOIN MarcadaProduccio ON ParosMarcadesProduccio.IDMarcada = MarcadaProduccio.ID
WHERE   MarcadaProduccio.Article IN (SELECT DISTINCT MarcadaProduccio.Article FROM MarcadaProduccio) 
GROUP BY MarcadaProduccio.Article

SELECT ParosMarcadesProduccio.IDMarcada 
FROM ParosMarcadesProduccio 
WHERE ParosMarcadesProduccio.DescripcioParo LIKE "%MONTAJE%"

我想要的是在ParosMarcadesProduccio.IDMarcada = MarcadaProduccio.ID时执行一个SELECT在第一个查询中请求但忽略第二个查询返回的行的查询。

我该怎么做?

谢谢

PD:MarcadaProduccio和ParosMarcadesProduccio表的结构

Main table Aux table

2 个答案:

答案 0 :(得分:1)

您的第一个查询无效,因为未定义ParosMarcadaProduccio。您可以将查询简化为以下内容:

SELECT mp.Article, SUM(mp.Rendiment * mp.HoresMarcada) / SUM(mp.HoresMarcada) AS MitjanaPonderada 
FROM MarcadaProduccio mp INNER JOIN
     ParosMarcadaProduccio pmp
     ON pmp.IDMarcada = mp.ID
WHERE mp.Article IN (SELECT mp2.Article FROM MarcadaProduccio mp2) 
GROUP BY mp.Article;

请注意,不需要SELECT DISTINCT

SELECT mp.Article, SUM(mp.Rendiment * mp.HoresMarcada) / SUM(mp.HoresMarcada) AS MitjanaPonderada 
FROM MarcadaProduccio mp INNER JOIN
     ParosMarcadaProduccio pmp
     ON pmp.IDMarcada = mp.ID
WHERE mp.Article IN (SELECT mp2.Article FROM MarcadaProduccio mp2) AND
      NOT EXISTS (SELECT pmp.IDMarcada
                  FROM ParosMarcadaProduccio pmp2
                  WHERE pmp2.DescripcioParo LIKE '%MONTAJE%' AND
                        pmp.IDMarcada = mp.id
                 )
GROUP BY mp.Article;

在学习使用子查询进行过滤时,我强烈建议NOT EXISTS超过NOT IN。当子查询返回NULL值时,后者表现得很奇怪。你最好先学会更好的方法。

答案 1 :(得分:0)

使用NOT IN使用以下方法,只需确保ParosMarcadesProduccio.IDMarcada永远不会NULL

SELECT MarcadaProduccio.ID, MarcadaProduccio.Article, 
       SUM(MarcadaProduccio.Rendiment * MarcadaProduccio.HoresMarcada)/SUM(MarcadaProduccio.HoresMarcada) AS MitjanaPonderada 
FROM MarcadaProduccio 
INNER JOIN MarcadaProduccio ON ParosMarcadesProduccio.IDMarcada = MarcadaProduccio.ID
WHERE   MarcadaProduccio.Article IN (SELECT DISTINCT MarcadaProduccio.Article FROM MarcadaProduccio) and
        MarcadaProduccio.ID NOT IN (
           --your second query
           SELECT ParosMarcadesProduccio.IDMarcada 
           FROM ParosMarcadesProduccio 
           WHERE ParosMarcadesProduccio.DescripcioParo LIKE "%MONTAJE%"             
        )
GROUP BY MarcadaProduccio.ID, MarcadaProduccio.Article

编辑:正如其他人所说,DISTINCT在您的查询中似乎存在疑问,应该可能已删除。