如何更改此SQL查询以提高性能?
我需要根据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 Cases,但没有成功。
答案 0 :(得分:0)
您需要执行以下操作: 如@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