Pular para o conteúdo

Fóruns SQL e PL/SQL [RESOLVIDO] Duvida Select [RESOLVIDO] Duvida Select

#96036
burga
Participante

    Existem várias maneiras diferentes de se fazer isto, segue três delas:

    SELECT DISTINCT DTAGENDA
    FROM (
    SELECT A.DTAGENDA
    FROM AGENDA_DETAIL A
    JOIN AGENDA_DADO B ON ( A.IDAGENDADADO = B.IDAGENDADADO )
    JOIN AGENDA_SALA C ON ( B.IDSALA = C.IDSALA )
    WHERE A.FLAG = 'DISPONIVEL' AND
    A.STATUS = 'ATIVADO' AND
    C.IDPRESTADORDETAIL = 1421 AND
    B.IDMEDICOESPECIALIDADE = 400 AND
    B.IDTUSS = 2810

    INTERSECT

    SELECT A.DTAGENDA
    FROM AGENDA_DETAIL A
    JOIN AGENDA_DADO B ON ( A.IDAGENDADADO = B.IDAGENDADADO )
    JOIN AGENDA_SALA C ON ( B.IDSALA = C.IDSALA )
    WHERE A.FLAG = 'DISPONIVEL' AND
    A.STATUS = 'ATIVADO' AND
    C.IDPRESTADORDETAIL = 1421 AND
    B.IDMEDICOESPECIALIDADE = 400 AND
    B.IDTUSS = 2825);

    ou

    SELECT DISTINCT A.DTAGENDA
    FROM AGENDA_DETAIL A
    WHERE EXISTS (
    SELECT 1
    FROM AGENDA_DETAIL D
    JOIN AGENDA_DADO B ON ( D.IDAGENDADADO = B.IDAGENDADADO )
    JOIN AGENDA_SALA C ON ( B.IDSALA = C.IDSALA )
    WHERE A.FLAG = 'DISPONIVEL' AND
    D.STATUS = 'ATIVADO' AND
    C.IDPRESTADORDETAIL = 1421 AND
    B.IDMEDICOESPECIALIDADE = 400 AND
    B.IDTUSS = 2810 AND
    A.DTAGENDA = D.DTAGENDA)
    AND EXISTS (
    SELECT 1
    FROM AGENDA_DETAIL D
    JOIN AGENDA_DADO B ON ( D.IDAGENDADADO = B.IDAGENDADADO )
    JOIN AGENDA_SALA C ON ( B.IDSALA = C.IDSALA )
    WHERE A.FLAG = 'DISPONIVEL' AND
    D.STATUS = 'ATIVADO' AND
    C.IDPRESTADORDETAIL = 1421 AND
    B.IDMEDICOESPECIALIDADE = 400 AND
    B.IDTUSS = 2825 AND
    A.DTAGENDA = D.DTAGENDA);

    ou

    SELECT DTAGENDA
    FROM (
    SELECT DISTINCT A.DTAGENDA, B.IDTUSS
    FROM AGENDA_DETAIL A
    JOIN AGENDA_DADO B ON ( A.IDAGENDADADO = B.IDAGENDADADO )
    JOIN AGENDA_SALA C ON ( B.IDSALA = C.IDSALA )
    WHERE A.FLAG = 'DISPONIVEL' AND
    A.STATUS = 'ATIVADO' AND
    C.IDPRESTADORDETAIL = 1421 AND
    B.IDMEDICOESPECIALIDADE = 400 AND
    (B.IDTUSS = 2810 OR B.IDTUSS = 2825))
    GROUP BY DTAGENDA
    HAVING COUNT(*) > 1;

    Não sei qual tem o pior custo, todas parecem ter um desempenho bem baixo… 😆