2016-04-01 13 views
1

Ich habe eine Tabelle leave_form, die wie folgt aussieht:Wie führe ich diese Join-Abfrage durch?

type  id reporting_id leave_bal from_date_id leave_from to_date_id leave_to number leave_for status applied_dates_id pendays 
personal 99 6   10  1023   full day 1313  full day 10  personal yes 1026    null 

ich für Termine separaten Tisch haben, so dass ich diese Daten in leave_form beziehen. Meine leave_date Tabelle wie folgt aussieht:

date_id(AI) dates(UK) 
1025  2016-02-18 
1301  2016-02-20 
1218  2016-02-16 

Diese date_id ich in from_date_id, to_date_id, applied_dates_id Spalten in leave_form Tabelle eingefügt haben das heißt alle Daten in leave_date Tabelle eingefügt werden und aus dieser Tabelle ich nur die date_id in leave_form Tabelle.

Es gibt auch eine Tabelle, die die emp_code und emp_name hält. Mein personal Tisch ist:

id(AI) emp_code(PK) emp_name 
99  K0209   Nijo 

Wenn ich versuche, das Datum für from_date_id, to_date_id, applied_dates_id Spalte von leave_form Tisch zu holen ich keine Werte.

Meine Abfrage die Daten zum Abholen ist:

type, emp_code, rm_id, rm_name, leave_bal, from_date, leave_from, to_date, leave_to, number, leave_for, status, applied_date, pendays 

das heißt keine Daten zurückgegeben wird, wenn ich diese Abfrage bin Ausführung:

select g.type, a.emp_code, h.rm_id, h.rm_name, g.leave_bal, i1.dates as from_date, 
    g.leave_from, i2.dates as to_date, g.leave_to, g.number, g.leave_for, g.status, 
    i3.dates as applied_date, g.pendays 
    from personal a 
    inner join leave_form g 
    on a.id = g.id 
    inner join inform_to_rm h 
    on h.reporting_id = g.reporting_id 
    inner join leave_dates i1 
    on i1.dates = g.from_date_id 
    inner join leave_dates i2 
    on i2.dates = g.to_date_id 
    inner join leave_dates i3 
    on i3.dates = g.applied_dates_id 
    where a.emp_code = 'K0209'; 

Es ist mir wie zeigt führen.

+0

Sie werden versuchen, links beizutreten wie "Left join leave_form g". Weil innerer Join nur das Ergebnis zurückgibt, wenn zwei Tabellen einen übereinstimmenden Wert haben, sonst nichts zurückgeben – cfprabhu

+1

eine Nebenfrage: Warum verwenden Sie dieses date_id Konstrukt, anstatt einfach das Datum in Ihrer leave_form Tabelle zu haben? – Burki

+0

Ich habe den linken Join gemacht, aber es gibt nicht die Daten für from_date, to_date, applied_date zurück. Ich möchte, dass die Daten zurückgegeben werden, indem die date_id mit leave_dates-Tabelle und leave_form-Tabelle verglichen wird. –

Antwort

0

Ich würde einem der Kommentare zu der Frage zustimmen. Ich würde empfehlen, das Datum direkt in der Tabelle leave_form anstelle eines FK auf eine Tabelle mit Daten zu verweisen. Aber zurück zu der Frage. Sie haben nicht alle Ihre Tabellen vollständig beschrieben, daher ist es möglich, dass es mehrere Probleme gibt, die ich nicht sehen kann, aber es gibt definitiv ein Problem.

Ihre Anfrage schließt sich auf

inner join leave_dates i1 
    on i1.dates = g.from_date_id 
inner join leave_dates i2 
    on i2.dates = g.to_date_id 
inner join leave_dates i3 
    on i3.dates = g.applied_dates_id 

Dies ist falsch. leave_dates.dates ist das tatsächliche DATE, während die Spalten, denen Sie beitreten (leave_form.from_date_id, leave_form.to_date_id, leave_form.applied_dates_id) Fremdschlüsselreferenzen sind.

Zum Beispiel ist 1023 nicht gleich 2016-02-18, so dass Sie keine Übereinstimmung erhalten. Das Ersetzen des obigen Abfrage-Snippets durch das folgende würde dieses spezielle Problem beheben.

inner join leave_dates i1 
    on i1.date_id = g.from_date_id 
inner join leave_dates i2 
    on i2.date_id = g.to_date_id 
inner join leave_dates i3 
    on i3.date_id = g.applied_dates_id 
+0

ty @ Nathan Kummer. Diese Abfrage funktioniert –

Verwandte Themen