设置:
我的数据库有3个表,我需要使用它们。我们打电话给前两个PartList
和PartHist
。 PartList
包含计算机上的所有部件号(我们将此字段称为ExpectedPart
)。 PartHist
包含已经过验证的所有组件(VerifiedPart
)。两个表都包含一个引用特定物理机器的MachineID
字段。
到目前为止,我的查询如下:
SELECT
ExpectedPart,
VerifiedPart
FROM
PartList List
LEFT OUTER JOIN PartHist Hist
ON
List.MachineID = Hist.MachineID
AND List.ExpectedPart = Hist.VerifiedPart
Where
List.MachineID = 'SomeID'
问题:
到目前为止,此查询可以很好地判断哪些组件尚未经过验证,因为VerifiedPart
的值为NULL
,直到该部分已经过验证。除了在一个特定部分中,部件号在PartList
中,但其验证存储在另一个表中(不是我的错)。因此,即使经过验证,查询也会为此部分返回NULL
。
第三个表格,我们称之为SpecialCase
,有MachineID
和VerifiedPartSP
个字段。如果该部分是该特殊情况部分的实例,则PartHist
表中还有一个包含'Y'的字段,如果不是,则包含'N'。该字段将被称为SpYesNo
。
问题: 我可以在查询中创建包含所有已验证部分的单个字段吗?我想到某种方式可能有一种方法来使用条件,以便......
IF (PartHist.SpYesNo = 'Y') THEN use SpecialCase.VerifiedPartSP as VerifiedPart
我正在使用IBM DB2数据库
答案 0 :(得分:1)
您可以将两个“已验证”的零件表合并在一起,然后加入:
SELECT
ExpectedPart,
VerifiedPart
FROM
PartList List
LEFT OUTER JOIN
(
SELECT machineid, verifiedpart FROM PartHist
UNION
SELECT machineid, verifiedpartsp FROM SpecialCase
)Hist
ON
List.MachineID = Hist.MachineID
AND List.ExpectedPart = Hist.VerifiedPart
Where
List.MachineID = 'SomeID'
你也可以LEFT OUTER JOIN
对这两个表进行检查,并使用CASE
语句检查任一字段,但我认为这种方法更符合您的要求,并且执行速度更快。
这是一个带有JOIN和CASE语句的版本,用以确定是什么:
SELECT
ExpectedPart,
CASE WHEN PartHist.SPYesNo = 'Y' THEN SpecialCase.VerifiedPartSP ELSE partHistVerifiedPart END as VerifiedPart
FROM
PartList List
LEFT OUTER JOIN PartHist ON
List.MachineID = PartHist.MachineID AND
List.ExpectedPart = PartHist.VerifiedPart
LEFT OUTER JOIN SpecialCase ON
List.MachineID = SpecialCase.MachineID AND
List.ExpectedPart = SpecialCase.VerifiedPart
Where
List.MachineID = 'SomeID'
答案 1 :(得分:-1)
SELECT DECODE(VerifiedPart, NULL, ExpectedPart,
VerifiedPart) as ValidPart
FROM
PartList List
LEFT OUTER JOIN PartHist Hist
ON
List.MachineID = Hist.MachineID
AND List.ExpectedPart = Hist.VerifiedPart
Where
List.MachineID = 'SomeID'