派生列结果

时间:2014-04-15 02:33:17

标签: sql oracle

我是一个SQL新手,必须制定一个SQL查询,列出QUALITY表中的所有5列,并添加两个列:批处理中生成的项的ProductCode,以及包含“的派生列BatchQuality”差“如果批次质量差(包含多于1个缺陷项目),否则为”好“。

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

我可以使用以下内容获得7列中的6列:

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的最后一列的任何想法,说明它是好还是坏?我认为我需要一个计数功能,但是一旦我有了这个功能,我将如何获得一个说明贫穷或好的新专栏? 感谢可以提供的任何帮助。

1 个答案:

答案 0 :(得分: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表中每一行的每一行。我不清楚你是否想要这个。