根据SQL

时间:2016-04-29 14:30:25

标签: sql db2

设置:

我的数据库有3个表,我需要使用它们。我们打电话给前两个PartListPartHistPartList包含计算机上的所有部件号(我们将此字段称为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,有MachineIDVerifiedPartSP个字段。如果该部分是该特殊情况部分的实例,则PartHist表中还有一个包含'Y'的字段,如果不是,则包含'N'。该字段将被称为SpYesNo

问题: 我可以在查询中创建包含所有已验证部分的单个字段吗?我想到某种方式可能有一种方法来使用条件,以便......

IF (PartHist.SpYesNo = 'Y') THEN use SpecialCase.VerifiedPartSP as VerifiedPart

我正在使用IBM DB2数据库

2 个答案:

答案 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'