我是一个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的最后一列的任何想法,说明它是好还是坏?我认为我需要一个计数功能,但是一旦我有了这个功能,我将如何获得一个说明贫穷或好的新专栏? 感谢可以提供的任何帮助。
答案 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
由于连接的性质,上述语句将重复生成表中quality
和defective
表中每一行的每一行。我不清楚你是否想要这个。