[英]How to improve SQL query performance with a lot of inner selects?
如何更改此 SQL 查询以提高性能?
我需要 select 客户、供应商或联系人的姓名、地址、电话等,具体取决于EntityID
( EntidadeID
)
EntidadeID = 1
从Clients
表中获取数据EntidadeID = 2
从Supplier
表中获取数据EntidadeID = 3
从Contacts
表中获取数据SQL 代码:
CREATE VIEW [dbo].[View_AtivTecnicasAtivTecnicasMatSer]
AS
SELECT
a.Numero, a.UserFullName, a.Data, a.Hora, a.CodigoTerceiro,
a.Contacto, a.Tarefa, a.UserTarefaNome, a.AFaturar, a.Resolvido,
a.AgendadaData, a.AgendadaHora, a.AlertaData, a.AlertaHora,
a.Execucao, a.NotasInternas, a.ResolvidoData, a.ResolvidoHora,
a.ResolvidoUserFullName, a.NumeroAtendInicial, a.EmailCliente,
a.EmailUserTarefa, a.PDFTarefaAnexo, a.DataNotifInformativa,
a.DataNotifResolucao, a.TipoDoc, a.UserTarefaAlertado,
a.Origem, a.Anulado, a.TotalSIVA, a.TotalCIVA, a.Moeda, a.Cambio,
a.TaxaDesconto, a.TipoPreco, dbo.WR_Temas.Descricao,
CASE
WHEN EntidadeID = 1 THEN
(SELECT Descricao
FROM dbo.WR_ClientesEstab
WHERE ID = a.ClienteEstabID)
END AS Estab,
CASE
WHEN a.EntidadeID = 1 THEN
(SELECT Morada
FROM dbo.WR_ClientesEstab
WHERE ID = a.ClienteEstabID)
WHEN a.EntidadeID = 2 THEN
(SELECT Morada
FROM dbo.WR_Fornecedores
WHERE Codigo = a.CodigoTerceiro)
END AS Morada,
CASE
WHEN a.EntidadeID = 1 THEN
(SELECT Localidade
FROM dbo.WR_ClientesEstab
WHERE ID = a.ClienteEstabID)
WHEN a.EntidadeID = 2 THEN
(SELECT Localidade
FROM dbo.WR_Fornecedores
WHERE Codigo = a.CodigoTerceiro)
END AS Localidade,
CASE
WHEN a.EntidadeID = 1 THEN
(SELECT CodPostal
FROM dbo.WR_ClientesEstab
WHERE ID = a.ClienteEstabID)
WHEN a.EntidadeID = 2 THEN
(SELECT CodPostal
FROM dbo.WR_Fornecedores
WHERE Codigo = a.CodigoTerceiro)
END AS CodPostal, CASE WHEN a.EntidadeID = 1 THEN
(SELECT Telefone
FROM dbo.WR_ClientesEstab
WHERE ID = a.ClienteEstabID) END AS TelefoneEstab, CASE WHEN a.EntidadeID = 1 THEN
(SELECT Telemovel
FROM dbo.WR_ClientesEstab
WHERE ID = a.ClienteEstabID) END AS TelemovelEstab, CASE WHEN a.EntidadeID = 1 THEN
(SELECT Nome
FROM dbo.WR_Clientes
WHERE Codigo = a.CodigoTerceiro) WHEN a.EntidadeID = 2 THEN
(SELECT Empresa
FROM dbo.WR_Contactos
WHERE ID = a.TerceiroID) WHEN a.EntidadeID = 3 THEN
(SELECT Nome
FROM dbo.WR_Fornecedores
WHERE Codigo = a.CodigoTerceiro) END AS NomeTerceiro, CASE WHEN a.EntidadeID = 1 THEN
(SELECT Telefone
FROM dbo.WR_Clientes
WHERE Codigo = a.CodigoTerceiro) WHEN a.EntidadeID = 2 THEN
(SELECT Telefone
FROM dbo.WR_Contactos
WHERE ID = a.TerceiroID) WHEN a.EntidadeID = 3 THEN
(SELECT Telefone
FROM dbo.WR_Fornecedores
WHERE Codigo = a.CodigoTerceiro) END AS Telefone, CASE WHEN a.EntidadeID = 1 THEN
(SELECT Telemovel
FROM dbo.WR_Clientes
WHERE Codigo = a.CodigoTerceiro) WHEN a.EntidadeID = 2 THEN
(SELECT Telemovel
FROM dbo.WR_Contactos
WHERE ID = a.TerceiroID) WHEN a.EntidadeID = 3 THEN
(SELECT Telemovel
FROM dbo.WR_Fornecedores
WHERE Codigo = a.CodigoTerceiro) END AS Telemovel, CASE WHEN a.EntidadeID = 1 THEN
(SELECT Contribuinte
FROM dbo.WR_Clientes
WHERE Codigo = a.CodigoTerceiro) WHEN a.EntidadeID = 2 THEN
(SELECT Contribuinte
FROM dbo.WR_Contactos
WHERE ID = a.TerceiroID) WHEN a.EntidadeID = 3 THEN
(SELECT Contribuinte
FROM dbo.WR_Fornecedores
WHERE Codigo = a.CodigoTerceiro) END AS Contribuinte, m.Linha, m.ArtigoCod, m.ArtigoDesc, m.Qtd, m.UN, m.ValorUnitario, m.DescontoPercentual, m.DescontoValor, m.Armazem, m.NumSerie, m.AnoERP, m.SerieERP,
m.TipoDocERP, m.NumDocERP, m.DataExportadoERP, m.UserExportouERP, m.TaxaIva, m.TotalDescontos AS TotalDescontosLinha, m.TotalGeral AS TotalGeralLinhas, m.Ordenacao, m.ExportadaERP, m.DocERP,
m.DescontoPercentual2, m.DescontoPercentual3, a.TotalMercadoria, a.TotalLiquido, a.TotalIVA, a.TotalGeral, a.TotalGeralEuros, a.TotalDescontosLinhas, a.TotalDescontosGlobal, a.TotalDescontos, a.EntidadeID,
m.DescontoPercentual4
FROM dbo.WR_AtivTecnicas AS a INNER JOIN
dbo.WR_Temas ON a.TemaID = dbo.WR_Temas.ID INNER JOIN
dbo.WR_AtivTecnicasMatSer AS m ON a.Numero = m.NumeroAtiv
GO
我尝试只制作 3 个 Select 所有字段的案例,但没有成功。
你需要做这样的事情:正如@jarlh提到的,你可以用左连接替换你的选择,也因为你有这些规则:
EntidadeID = 1 gets data from Clients table
EntidadeID = 2 gets data from Supplier table
EntidadeID = 3 gets data from Contacts table
您可以将它们包含在您的加入条件中,这样您就可以完全删除案例,如下例所示:
SELECT
*
-- instead of case for example for Telemovel
, COALESCE( ct.Telemovel, st.Telemovel, cts.Telemovel)
-- replace all the case statements following above logic
FROM
dbo.WR_AtivTecnicas AS A
INNER JOIN dbo.WR_Temas
ON A.TemaID = dbo.WR_Temas.ID
INNER JOIN dbo.WR_AtivTecnicasMatSer AS m
ON A.Numero = m.NumeroAtiv
LEFT OUTER JOIN ClientsTable ct
ON ct.Codigo = a.CodigoTerceiro -- replace with proper condition
AND EntidadeID = 1
LEFT OUTER JOIN SupplierTable st
ON st.id = A.id -- replace with proper condition
AND EntidadeID = 2
LEFT OUTER JOIN ContactsTable cts
ON cts.ID = a.TerceiroID -- replace with proper condition
AND EntidadeID = 3
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.