› Fóruns › SQL e PL/SQL › [RESOLVIDO] Duvida Select › [RESOLVIDO] Duvida Select
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… 😆