2016-08-09 6 views
0

Ich benutze PostgreSQL 9.5. Ich habe Schlepptau TabellenSQL JOIN bekomme Daten aus der linken Tabelle Nur wenn alle richtigen Spalten übereinstimmen

EmployeeReportMarch 
EmployeeId  Bonus  Day 
--------------------------------- 
1    10000  23 

EmployeeReport20152016 
EmployeeId  Bonus  Month 
--------------------------------- 
1    10000  02 
1    10000  03 

EmployeeReport 
EmployeeId  Bonus  FiscalYear 
--------------------------------- 
1    100000  20152016 
1    90000  20162017 

Calendar 
Day_Id   Day Month  FiscalYear 
-------------------------------------------- 
2015-03-21  21  3   20152016 
2015-03-22  22  3   20152016 
2015-03-23  23  3   20152016 
2015-03-24  24  3   20152016 
2015-03-25  25  3   20152016 

Kalender Tabelle ist von ‚2010-01-01‘ auf ‚2016.12.31‘. Das Geschäftsjahr ist vom 1. April bis zum 31. März.

Wenn ich Beitritt sowohl Tabelle von Daten zu erhalten

SELECT e.EmployeeeId, e.Bonus 
FROM Employee e INNER JOIN Calendar c ON e.Day = c.Day 
WHERE c.Day_Id BETWEEN '2015-02-01'::Date AND '2015-03-31'::Date; 

Ausgang:

EmployeeId  Bonus  Day_Id 
------------------------------------- 
1    10000  2015-02-23 
1    10000  2015-03-23 

SELECT e.EmployeeeId, e.Bonus 
FROM Employee e INNER JOIN Calendar c ON e.Month = c.Month 
WHERE c.Day_Id BETWEEN '2015-02-01'::Date AND '2015-03-31'::Date; 

Ausgang:

EmployeeId  Bonus 
-------------------- 
1    100000 
1    100000 

--59 Rows (2 Month rows) 

SELECT e.EmployeeeId, e.Bonus 
FROM Employee e INNER JOIN Calendar c ON e.FiscalYear = c.FiscalYear 
WHERE c.Day_Id BETWEEN '2015-02-01'::Date AND '2015-03-31'::Date; 

Ausgang:

EmployeeId  Bonus 
-------------------- 
1    10000 
1    10000 

--365 Rows 

Aber es ist nur ein Datensatz in der Tabelle übrig. Ich habe es auch mit OUTER JOIN versucht, aber das Ergebnis war das selbe wie die Idee.

+0

Ihre Frage ergibt keinen Sinn. "nur ein Datensatz in der Tabelle übrig". Hä? Sie tun eine Auswahl, dies hat keine Auswirkungen auf den Inhalt der Datensätze. Bitte bearbeiten Sie Ihre Frage und geben Sie Beispieldaten * und * gewünschte Ergebnisse an. –

+0

'SELECT e.EmployeeId, e.Bonus, c.DayId' << - ein Komma hinzufügen – joop

+0

@Gordon Linoff ist nur ein Beispiel. In meinem Tisch sind lakhs verzeichnet. Problem ist das Geben eines Datensatzes von einem anderen Monat, der nicht existiert, da der Tag in der Kalendertabelle übereinstimmt. –

Antwort

0

Es ist Aufgabe der Architektur, nicht JOIN-Anweisung ...

Ihr Tisch Kalender haben Primärschlüsselspalte Day_Id, aber Sie versuchen, es durch Spalte Tag zu verbinden, die nicht eindeutig ist. Es gibt viele Datensätze mit Tag = 23 (12 pro Jahr, um genau zu sein). Also, Sie erhalten 1 Reihe pro Monat in Ihrer Tabelle.

Um dieses Problem zu beheben, sollten Sie es nach Spalte Day_Id (oder um 3 Spalten gleichzeitig: Jahr + Monat + Tag) verbinden.

+0

Angenommen, es gibt Spalte Monat oder Jahr anstelle von Tag in meiner Tabelle Mitarbeiter dann? –

+0

Jahr + Monat + Tag. Oder Day_Id. – Razzka

+0

Es funktioniert nur für Tagesdaten. Was ist, wenn die Bonusspalte den vollen Jahresbonus enthält und wenn ich für mehrere Jahre die Kalenderspalten-Jahresspalte abfrage, dann funktioniert Year + Month + Day oder Day_Id nicht. –

0

Join kombiniert übereinstimmende Zeilen aus beiden Tabellen. Da der Tag in der Angestelltentabelle zweimal mit dem Tag in der Kalendertabelle innerhalb des zwischen der Anweisung angegebenen Bereichs übereinstimmt, sind das zwei Reihen in der Ausgabe. Ich denke, wenn Sie einen Join verwenden, gibt es zwei Zeilen in der Ausgabe.

+0

Gibt es einen anderen Weg, es zu tun? –

+0

Sie müssen nach Mitarbeiter-ID übereinstimmen oder Sie können die Reichweite innerhalb eines Monats angeben, auf diese Weise wird nur ein Tag ausgewählt. –

+0

Ich kann nicht Mitarbeiter ID in Kalendertabelle hinzufügen, hat es Beziehung mit vielen anderen Tabellen und ich habe Tabelle für jeden Monat, so kann ich nicht Monat Startbereich aus jeder Tabelle geben. Das gleiche Szenario gilt für die Spalte "Jahr und Monat". –

Verwandte Themen