创建一个包含2个不同领域的基于条件SQL
设置数据字段:创建一个包含2个不同领域的基于条件SQL
我的数据库有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数据库
你可以联合你的两个“已验证”部分表一起,然后加盟:
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'
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'
请评论为什么解决方案不正确。我想了解更多。谢谢。 –
没有降票,但有几个问题给你。你在SELECT语句的末尾有“ValidPart”,我假设你的意思是别的,但不完全确定是什么。此外,根据读取DECODE的描述,这将查看VerifiedPart列,如果为NULL,则将用ExpectedPart替换该值。否则,该值将保留为原始的VerifiedPart值。由于这不能访问SpecialCase的VerifiedPart值,我不明白它是如何解决问题的 – corbfon
我刚使用ValidPart作为别名。你需要有一个名字,否则它会作为整个解码语句输出。我不清楚特殊箱的价值是什么。这只是你想要的输出中的东西吗? –
尝试过这一点,但似乎我们的数据库不支持UNION(或展柜,我们的查询经历不会允许) – corbfon
CASE声明立即生效。谢谢! – corbfon