Sql 派生列结果

Sql 派生列结果,sql,oracle,Sql,Oracle,我是一个sql新手,必须制定一个sql查询,列出质量表中的所有5列,并再添加两列:批次中生产的项目的ProductCode,以及衍生列BatchQuality,如果批次质量差(包含1个以上缺陷项目),则包含“差”,否则包含“好” 我从oracle数据库中放入的3个表中提取:生产表(包含serialno、batchno和productcode)、质量表(batchno、test1、test2、Test3、test4)和缺陷表(defectiveid、serialno) 通过使用以下内容,我可以从7

我是一个sql新手,必须制定一个sql查询,列出质量表中的所有5列,并再添加两列:批次中生产的项目的ProductCode,以及衍生列BatchQuality,如果批次质量差(包含1个以上缺陷项目),则包含“差”,否则包含“好”

我从oracle数据库中放入的3个表中提取:生产表(包含serialno、batchno和productcode)、质量表(batchno、test1、test2、Test3、test4)和缺陷表(defectiveid、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的专栏,说明它是好是坏,有什么想法吗?我想我需要一个count函数,但一旦我有了它,我怎么才能得到一个新的列,它将说明poor或good?
感谢您提供的帮助。

您当前的查询是一个内部联接,在
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
对于没有缺陷的产品,
缺陷
表中列的值将为空。因此,要获取产品的“好”或“坏”标志,需要检查该值是否为空:

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

但是,由于联接的性质,上述语句将针对
质量
缺陷
表中的每一行重复生产表中的每一行。我不清楚你到底要不要

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