2014-04-15 37 views
0

我是一名SQL新手,必须制定一个SQL查询,列出QUALITY表中的所有5列,并添加两列:在批处理中生成的项目的ProductCode和派生列BatchQuality,其中包含如果批次质量较差(包含多于一个的不合格品)则为“差”,否则为“良好”。派生列结果

我从我放入oracle数据库的3个表中提取:生产表(包含serialno,batchno和productcode),质量表(batchno,test1,test2,teste3,test4)和有缺陷的表, 序列号)。

我能够用得到6出的7列如下:

select q.batchno, q.test1, q.test2, q.test3, q.test4, p.productcode_id 
from production p, defective d, quality q 
where d.serialno = p.serialno 
and p.batchno = q.batchno; 

如何让所谓batchquality最后一栏说,如果它是好还是差的任何想法?我在想,我需要一个计数函数,但是一旦我有了这个功能,我将如何去获得一个可以陈述差或好的新列? 欣赏任何可以提供的帮助。

+2

欢迎来到SO。显示表格模式和一些示例数据会更有帮助。 – OldProgrammer

回答

0

您当前的查询是在where子句中使用旧的过时隐式联接的内部联接。如果存在缺陷,我假设defective表只包含一行产品。你的内部连接总是只会返回有缺陷的部分,而不是没有缺陷的部分。为此你需要一个外连接。另一个原因抛弃过时的隐式连接和使用一个明确的JOIN操作:

select q.batchno, q.test1, q.test2, q.test3, q.test4, p.productcode_id 
from production p 
    JOIN quality q ON p.batchno = q.batchno; 
    LEFT JOIN defective d ON d.serialno = p.serialno 

对于做有缺陷的产品,从defective表列中的值将是无效的。因此,要获得一个标志,如果一个产品有是“好”或“坏”,你需要检查,如果该值为null:

select q.batchno, q.test1, q.test2, q.test3, q.test4, p.productcode_id, 
     case 
      when d.serialno is null then 'good' 
      else 'bad' 
     as batch_quality 
from production p 
    JOIN quality q ON p.batchno = q.batchno; 
    LEFT JOIN defective d ON d.serialno = p.serialno 

由于自然的连接,上面的语句将然而从重复每一行qualitydefective表中每行的生产表。我不清楚你是否愿意。