2015-09-01 62 views
0

我需要比较两个表,并获得未完成或不存在的pn。 我无法在任何地方找到我需要的答案。以下是我需要的表格和示例输出。非常感谢你能帮助我的人。如何选择不在另一个表中的记录?

表1:

+------------+----------+------------+----+---------------------+ 
| cert  | job  | pcmk  | pn | stat    | 
+------------+----------+------------+----+---------------------+ 
| MF21600001 | 6216  | A148  | 1 | 2015-08-14 13:20:29 | 
| MF21600001 | 6216  | A148  | 2 |      | 
+------------+----------+------------+----+---------------------+ 

表2:

+-----------+----------+----+ 
| job  | pcmk  | pn | 
+-----------+----------+----+ 
| 6216  | A148  | 1 | 
| 6216  | A148  | 2 | 
| 6216  | A148  | 3 | 
+-----------+----------+----+ 

实施例输出在表2中没有的表1或状态=空白/ NULL的行:

+------------+------+------+----+ 
| cert  | job | pcmk | pn | 
+------------+------+------+----+ 
| MF21600001 | 6216 | A148 | 2 | 
| MF21600001 | 6216 | A148 | 3 | 
+------------+------+------+----+ 

行,我采取了第一个想法,并玩了一下。

SELECT Table1.cert, pninput.job, pninput.pcmk, pninput.pn, pn.stat 
FROM Table1, Table2 
WHERE NOT EXISTS (SELECT * 
        FROM Table1 
        WHERE Table1.pcmk = Table2.pcmk AND Table1.job = Table2.job AND Table1.stat = '') 

但是现在每一个证书被配对每pcmk和工作,即使每个证书只能有1个作业和1个pcmk而且还抽放35+秒运行

+1

一个简单的子查询就像'select * from table 1 where pm not in(select from table2)'。可能还有其他更好的解决方案,但如果性能不成问题,这将起作用。 –

+0

您可以在http://sqlfiddle.com/上创建表格和样本数据,并与我们分享链接。 – seahawk

回答

0

澄清:一个作业可以有多个pcmk和对比应为每个pcmk

SELECT t1.cert,t2.job,t2.pcmk,t2.pn 
FROM table1 t1 
join table2 t2 on (t1.pcmk=t2.pcmk) 
WHERE (t1.pn=t2.pn and (t1.stat="" or t1.stat is null)) 
or t2.pn NOT IN(
    SELECT pn 
    FROM table1 
    WHERE table1.pcmk=t2.pcmk) 
    group by t2.pcmk,t2.pn; 

假设来完成:查询是针对单job。对于多个job,请加job检入where-clause,on-clause' and组。

+0

我的上帝,我想你几乎可以得到它。在table2中,每个job/pn可以有多个pcmk。当玩你提供的链接时,这个(http://sqlfiddle.com/#!9/58841/16上的验证)只有当不同的pcmk有不同的pn时才有效。这里是我如何改变它(http://sqlfiddle.com/#!9/72f59/1/0)使其工作, –

+0

@DavidJansson:您的要求不能满足(sqlfiddle.com/#!9/ 72f59/1/0)。你应该在'on-clause','where-clause'和'group by'中使用'pcmk'而不是'job'。我希望我回答你的问题。 – seahawk

+0

另外为了澄清每个工作都有很多工作可以有相同的pn(生产笔记)编号,但他们没有关系。每个PN可以有多个pcmk。 –

1

如果我改一下你的病情,您希望table2中的行在table中没有对应的行,且行号为null。这听起来像一个exists条件:

SELECT * 
FROM table2 
WHERE NOT EXISTS (SELECT * 
        FROM table1 
        WHERE table1.pn = table2.pn AND stat IS NOT NULL) 
+0

很好的尝试,但不幸的是,我想我的问题是我要求太多我需要表1中的证书和表2中的“休息”,其中“休息”或者不存在于表1或状态NOT NULL在桌子上1 –

0

一个你能处理这个方法是从t1得到pn值的列表是不是空:

SELECT pn 
FROM table1 
WHERE stat IS NOT NULL; 

然后你可以拉从表2的所有值那不在那个组里。这将占到那些在表1空状态的所有pn值不在表1可言,还有值:

SELECT * 
FROM table2 
WHERE pn NOT IN(
    SELECT pn 
    FROM table1 
    WHERE stat IS NOT NULL); 

下面是一个例子SQL Fiddle

相关问题