首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL从多个表中选择值

SQL从多个表中选择值
EN

Stack Overflow用户
提问于 2014-07-22 13:39:52
回答 2查看 30关注 0票数 0

我有一个名为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匹配的所有行。然后,当我找到所有匹配的行时,使用ID并使用其他4个表获取actaul名称。我在SQL方面没有经验,找到一个很好的解决方案让我很困惑。我确实有正在工作的代码,但是我确信它没有效率:

代码语言:javascript
复制
(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')

有什么方法可以实现更快、最有效的查询?谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-22 13:44:58

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

关键是确保索引引用表中的所有列( where子句中的列是主键,然后自动进行)。实际上,最好的索引应该同时提到两列:

代码语言:javascript
复制
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)

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

外部查询还可以从索引中获益:

代码语言:javascript
复制
BUSINESS_FACING_SLA(ASV_ID, blah_id)
票数 2
EN

Stack Overflow用户

发布于 2014-07-22 13:50:06

您要寻找的是JOIN关键字--使用左(或内)连接可能会提高性能,并且绝对简化了查询。

代码语言:javascript
复制
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'
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24888998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档