我正在尝试在子查询中使用CASE
。我需要从表id_request
中获取信息table_1
,但是,如果我的id is null
的值是,我需要从id_request
中提取table_2
。有人可以帮我吗?
我的查询中有一部分与该问题有关:
(case
when MAX(id_pedido) is null
then (select MAX(id_pedido)
from sf_vendas_online
where id_venda = sf_vendas.id)
else MAX(id_pedido)
end id_pedido) id_pedido,
有我的查询...
SELECT *
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY sf_vendas.id desc) as row,
sf_vendas.*,P.nome_pessoa,P.sobrenome_pessoa,
ISNULL((SELECT top 1 descricao_documento FROM sf_vendas_parcelas INNER JOIN sf_tipo_documento ON sf_tipo_documento.id = sf_vendas_parcelas.tipo_documento WHERE id_venda = sf_vendas.id),'CORTESIA') id_vendas_parcelas,
(select MAX(bol_data_parcela) from sf_vendas_boleto where id_venda = sf_vendas.id) bol_data_parcela,
(select MAX(id) from sf_vendas_boleto where id_venda = sf_vendas.id) bol_id,
(select SUM(quantidade) from sf_vendas_itens where id_venda = sf_vendas.id) quantidade,
(select SUM(valor_bruto) from sf_vendas_itens where id_venda = sf_vendas.id) valor_bruto,
(select SUM(valor_desconto) from sf_vendas_itens where id_venda = sf_vendas.id) valor_desconto,
(select MAX(data_pagamento) from sf_vendas_parcelas where id_venda = sf_vendas.id) data_pagameto,
(select SUM(valor_pago) from sf_vendas_parcelas where id_venda = sf_vendas.id) valor_pago,
(select sum(valor_bruto - valor_desconto) from sf_vendas_itens where id_venda = sf_vendas.id) valor_total,
(select MAX(bol_valor) from sf_vendas_boleto where id_venda = sf_vendas.id) bol_valor,
-- CASE statement is this line:
(case when MAX(id_pedido) is null then (select MAX(id_pedido) from sf_vendas_online where id_venda = sf_vendas.id) else MAX(id_pedido) end id_pedido) id_pedido,
(select MAX(bol_nosso_numero) from sf_vendas_boleto where id_venda = sf_vendas.id) bol_nosso_numero
FROM dbo.sf_vendas
INNER JOIN sf_pessoa P ON P.id = sf_vendas.pessoa_venda
) as x
ORDER BY id desc
答案 0 :(得分:1)
这应该通过减少访问附加表的次数来帮助显着提高性能:
SELECT *
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY sf_vendas.id desc) as row,
sf_vendas.*,P.nome_pessoa,P.sobrenome_pessoa,
ISNULL(
(SELECT top 1 descricao_documento
FROM sf_vendas_parcelas
INNER JOIN sf_tipo_documento ON sf_tipo_documento.id = sf_vendas_parcelas.tipo_documento
WHERE id_venda = sf_vendas.id),
'CORTESIA') id_vendas_parcelas,
vb.bol_data_parcela, vb.bol_id, vb.bol_valor, vb.bol_nosso_numero
vi.quantidade, vi.valor_bruto, vi.valor_desconto, vi.valor_total,
vp.data_pagamento, vp.valor_pago,
COALESCE(MAX(id_pedido),
(SELECT MAX(id_pedido)
FROM sf_vendas_online
WHERE id_venda = sf_vendas.id)
) end id_pedido
FROM dbo.sf_vendas
INNER JOIN sf_pessoa P ON P.id = sf_vendas.pessoa_venda
OUTER APPLY (
SELECT MAX(bol_data_parcela) bol_data_parcela, MAX(id) bol_id,
MAX(bol_valor) bol_valor, MAX(bol_nosso_numero) bol_nosso_numero
FROM sf_vendas_boleto
WHERE id_venda = sf_vendas.id
) vb
OUTER APPLY (
SELECT SUM(quantidade) quantidade, SUM(valor_bruto) valor_bruto,
SUM(valor_desconto) valor_desconto, sum(valor_bruto - valor_desconto) valor_total
FROM sf_vendas_itens
WHERE id_venda = sf_vendas.id
) vi
OUTER APPLY (
SELECT MAX(data_pagamento) data_pagamento, SUM(valor_pago) valor_pago
FROM sf_vendas_parcelas
WHERE id_venda = sf_vendas.id
) vp
) as x
ORDER BY id desc
我怀疑您可以通过使用GROUP BY
和简单的LEFT JOIN
操作(而不是OUTER APPLY
)来进一步大大改进,但是我对您的系统了解不足以尝试这种操作。 / p>
答案 1 :(得分:0)
使用COALESCE()
函数将返回第一个非空值,并使用带有两个表的左连接
select COALESCE ( max(t1.id),max(t2.id))
from t1 left join t2 on t1.id=t2.id
答案 2 :(得分:0)
我使用类似于Coalesc的ISNULL函数进行了解析
有我的代码...
ISNULL((SELECT MAX(id_pedido) FROM sf_vendas_online where id_venda = sf_vendas.id),(SELECT MAX(id_pedido) FROM sf_vendas_boleto where id_venda = sf_vendas.id)) id_pedido,