子选择SQL Server中的案例

时间:2018-10-18 19:53:15

标签: sql sql-server

我正在尝试在子查询中使用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

3 个答案:

答案 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,