2016-02-10 6 views
1

J'ai 2 tables:Proble avec deux tables joindre à la condition sous-requête

1) et_pics - ici des informations sur les employés:

  • ob_no, int, clé, par exemple 2020
  • c_name, varchar, par ex. Dribbler D.E.
  • e_post, varchar, par ex. Président

    SELECT * FROM et_pics:

ob_no | nom_c | e_post

2020 | Dribbler D.E. | Président

2) et_vacations - ici des informations sur les vacances sont stockées:

  • ob_no, int, par exemple 666 e_pic, int, connexion à pic.ob_no, par ex. 2020
  • c_name, varchar, par ex. Vacances bla bla
  • e_dateFrom, date, par ex. 2010-08-08 00: 00: 00.000
  • e_dateTo, date, 2010-08-09 00 par exemple: 00: 00.000

    SELECT * FROM et_vacations retours vac

ob_no | e_pic | c_name | e_dateFrom | e_datePour
| 777 | 2020 | Vacances bla bla | 2010-08-08 00: 00: 00.000 | 2010-08-09 00: 00: 00.000 |

777 | 2020 | Vacances bla bla | 2015-08-08 00: 00: 00.000 | 2015-08-09 00: 00: 00.000 |

Ce que je dois faire est de se connecter à et_vacations et_pics conditions:

  • pourrait être le seul enregistrement de vacances par personne (me semble max (e_dateTo));
  • L'enregistrement de vacances doit être> = getDate() ou null est affiché.

ne comprends pas comment écrire sous_requête droite - essayé de cette façon, mais pas de chance:

SELECT 
    pics.c_name, 
    pics.e_post, 
vac.e_dateTo 
FROM et_pics pics 
INNER JOIN et_division div on pics.e_division = div.ob_no 
INNER JOIN et_vacations vac on vac.e_pic = pics.ob_no 
WHERE 
    (pics.e_fireDate IS NULL OR pics.e_fireDate > getDate()) 
    AND vac.e_dateTo IN (
    SELECT MAX(vac.e_pic) from et_vacations vac 
    GROUP BY vac.e_pic 
    ) 
    ORDER BY pics.c_name; 

Merci à l'avance pour toute aide pour résoudre cette question.

+0

Je ne comprends pas bien .. pouvez-vous poster échantillon de résultats attendus ? – sagi

+0

Voici un bon endroit pour commencer. http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ Ou vous pouvez poster des tableaux et des exemples de données à sqlfiddle.com –

+0

Que fait " pas de chance "signifie? Quel est le problème avec les résultats obtenus? –

Répondre

1

Je crois que votre problème a besoin d'un peu plus de définition autour de ce qui est considéré comme la date de vacances (la date de début ?, la date de fin?) Qui vous intéresse, mais voici un début. Remarque J'ai laissé la jointure à la division puisque vous l'aviez mais vous n'utilisez pas les données de cette table dans les champs select ou where.À moins qu'il ne soit utilisé pour réduire le nombre de personnes dans la requête, car tout le monde dans et_pics n'est pas dans et_division, cette jointure doit être supprimée.

SELECT 
    pics.c_name, 
    pics.e_post, 
vac.e_dateTo 
FROM et_pics pics 
INNER JOIN et_division div on pics.e_division = div.ob_no 
INNER JOIN(select e_pic, max(e_dateTo) from et_vacations group by e_pic)vac on vac.e_pic = pics.ob_no 
WHERE 
    (pics.e_fireDate IS NULL OR pics.e_fireDate > getDate()) 
     ORDER BY pics.c_name; 
0

Je soleved par moi-même avec CTE, mais HLGEM était Frist:

;WITH Vacations_nah AS 
(
    SELECT 
     vac.e_pic, 
     MAX(vac.e_dateTo) AS e_dateTo_2 
    FROM et_vacations vac 
    WHERE e_dateTo >=getDate() 
    GROUP BY vac.e_pic 
) 
SELECT 
    pics.c_name, 
    pics.e_post, 
    e_dateTo_2 
FROM et_pics pics 
    INNER JOIN et_division div on pics.e_division = div.ob_no 
    LEFT JOIN Vacations_nah nah on nah.e_pic = pics.ob_no 
WHERE 
    (pics.e_fireDate IS NULL OR pics.e_fireDate > getDate()) 
    AND pics.c_visible=1 
1

Je suppose que vous avez besoin pour les employés de sortie avec le plus proche vacances rabotés (?). Ensuite, vous devriez vous joindre déjà préparé et_vacations table à l'aide LEFT JOIN en cas de vacances vides pour certains dossiers d'employés:

WITH T_vac as 
(
    select et_vacations.*, 
    ROW_NUMBER() OVER (PARTITION BY e_pic ORDER BY e_dateTo) as RowNum 
    from et_vacations 
    where e_dateTo>=getDate() 
) 
SELECT 
    pics.c_name, 
    pics.e_post, 
    vac. e_dateFrom, 
    vac.e_dateTo 
FROM et_pics pics 
LEFT JOIN T_vac vac on (vac.e_pic = pics.ob_no) AND (vac.RowNum=1) 
    ORDER BY pics.c_name; 

SQLFiddle demo