2016-04-29 53 views
0

设置数据字段:创建一个包含2个不同领域的基于条件SQL

我的数据库有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' 

问题:

到目前为止,这个查询的工作非常漂亮,告诉哪些组件尚未得到验证,作为值的VerifiedPartNULL,直到该部分已被验证。除了在一个特定的部分,其中零件编号在PartList,但其验证存储在另一个表(不是我的错)。因此,即使在验证之后,该部分的查询也会返回NULL

这个第三个表格,我们称之为SpecialCase,有MachineIDVerifiedPartSP字段。 PartHist表中还有一个字段,如果零件是此特例零件的实例,则包含'Y',如果不是,则为'N'。该字段将被称为SpYesNo

问题: 我可以在查询中创建一个包含所有已验证零件的字段吗?我想在某种程度上有可能是使用,这样的条件的方式...

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

我使用的是IBM DB2数据库

回答

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语句来检查任何领域,但我认为这种做法更符合您的要求,并会执行得更快。


这是一个带联接和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' 
+0

尝试过这一点,但似乎我们的数据库不支持UNION(或展柜,我们的查询经历不会允许) – corbfon

+0

CASE声明立即生效。谢谢! – corbfon

-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' 
+0

请评论为什么解决方案不正确。我想了解更多。谢谢。 –

+0

没有降票,但有几个问题给你。你在SELECT语句的末尾有“ValidPart”,我假设你的意思是别的,但不完全确定是什么。此外,根据读取DECODE的描述,这将查看VerifiedPart列,如果为NULL,则将用ExpectedPart替换该值。否则,该值将保留为原始的VerifiedPart值。由于这不能访问SpecialCase的VerifiedPart值,我不明白它是如何解决问题的 – corbfon

+0

我刚使用ValidPart作为别名。你需要有一个名字,否则它会作为整个解码语句输出。我不清楚特殊箱的价值是什么。这只是你想要的输出中的东西吗? –

相关问题