繁体   English   中英

SQL从多个表中选择值

[英]SQL Selecting Values From Multiple Tables

我有一个名为SLA_BUSINESS_FACING_SLA的表,其中每个唯一行都包含某些属性的ID。 它们被称为ASV_ID,Process_ID,SLA_Comp_ID和SLA_Type_ID(列)。 我还有其他4个表,我需要使用SLA_BUSINESS表中的ID来提取名称。 我有两个包含ASV_ID和Process_ID的变量,需要在SLA_BUSINESS中找到ASV_ID和Process_ID匹配的所有行。 然后,当我找到所有匹配的行时,使用其他4个表获取ID并获取实际名称。 我没有SQL方面的经验,因此找到一个好的解决方案会使我感到困惑。 我确实有正在运行的代码,但是我确定它效率不高:

(SELECT (SELECT component_class FROM SLA_COMP_CLASS WHERE 
BUSINESS_FACING_SLA.SLA_Comp_ID = SLA_COMP_CLASS.SLA_Comp_ID) AS        Component_Class,
(SELECT CommonName FROM vkd593_COAF_ASVs WHERE 
BUSINESS_FACING_SLA.ASV_ID = ASVs.Name) AS ASV,
(SELECT process_name FROM PROCESSES WHERE 
BUSINESS_FACING_SLA.PROCESS_ID = PROCESSES.decomp_num) AS Process,
(SELECT component_type FROM SLA_COMP_TYPE WHERE 
BUSINESS_FACING_SLA.SLA_Type_ID = SLA_COMP_TYPE.SLA_Type_ID) AS  Component_Type
FROM BUSINESS_FACING_SLA
WHERE ASV_ID = 'Blah' AND PROCESS_ID = 'Blah')

有什么方法可以进行更快,最有效的查询? 谢谢

您的查询通常与执行left outer join (另一种更传统的方法)一样快。

关键是确保引用表中的所有列都已索引( where子句中的列是主键,然后这会自动发生)。 实际上,最佳索引将同时提到两列:

SLA_COMP_CLASS(SLA_Comp_ID, component_class)
vkd593_COAF_ASVs(Name, CommonName)
PROCESSES(decomp_num, process_name)
SLA_COMP_TYPE(SLA_Type_ID, component_type)

这些称为“覆盖索引”,因为查询所需的所有列都在索引中,因此引擎不必在数据页中查找列。

您的外部查询也可以从索引中受益:

BUSINESS_FACING_SLA(ASV_ID, blah_id)

您正在寻找的是JOIN关键字-使用LEFT(或INNER)JOIN可能会改善您的性能,并肯定会简化您的查询。

SELECT 
    SAL_COMP_CLASS.Component_Class,
    vkd593_COAF_ASVs.CommonName AS ASV,
    PROCESSES.Process_Name AS Process,
    SLA_COMP_TYPE.Component_Type 
FROM 
    BUSINESS_FACING_SLA
     LEFT JOIN 
    SLA_COMP_CLASS ON BUSINESS_FACING_SLA.SLA_Comp_ID = SLA_COMP_CLASS.SLA_Comp_ID
     LEFT JOIN 
    vkd593_COAF_ASVs ON BUSINESS_FACING_SLA.ASV_ID = ASVs.Name
     LEFT JOIN 
    PROCESSES ON BUSINESS_FACING_SLA.PROCESS_ID = PROCESSES.decomp_num
     LEFT JOIN 
    SLA_COMP_TYPE ON BUSINESS_FACING_SLA.SLA_Type_ID = SLA_COMP_TYPE.SLA_Type_ID
WHERE ASV_ID = 'Blah' AND PROCESS_ID = 'Blah'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM