2017-10-03 4 views
0

Ich habe eine tägliche Zahlenansicht und eine monatliche Zahlenansicht.JOIN produziert keine Ergebnisse

Tagesansicht:

SELECT * (includes sum) 
FROM 
Person 
FULL OUTER JOIN Profit 
ON Person.id = Profit.id 
AND Profit.[DATE] = CAST(getdate() -1 as Date) 

Nun gibt diese 70 Zeilen.

Monatsansicht:

SELECT * (includes sum) 
FROM 
Person 
FULL OUTER JOIN Profit 
ON Person.id = profit.id 
WHERE 
[DATE] BETWEEN CAST(MONTH(GETDATE()) AS VARCHAR) + '/' + '01/' + + 
CAST(YEAR(GETDATE()) AS VARCHAR) 
AND GETDATE() 

Das gibt 40 Zeilen.

Jetzt in meiner Select-Anweisung möchte ich alle Zeilen aus der Tagesansicht zurückgeben, unabhängig davon, ob es eine Übereinstimmung in der Monatsansicht gibt.

Jetzt dachte ich, so etwas wie dies funktionieren würde:

SELECT * 
FROM 
DailyView 
LEFT JOIN 
MonthlyView 
ON DailyView.id = MonthlyView.id 

Aber das gibt nur 40 Zeilen. Ich habe auch versucht, volle äußere Verbindung, aber das gibt immer noch nur 40 Zeilen. Was könnte der Grund dafür sein? Danke

+0

Sie sollten Beispieldaten zeigen, und die gewünschten Ergebnisse. Der 'FULL OUTER JOIN' ist verdächtig. –

Antwort

2

Ihre WHERE Klausel rückgängig macht die outer join.

Sie können Ihr Problem beheben, indem Sie die Bedingungen in die Klausel ON verschieben und die WHERE-Klausel entfernen.

Ihre Abfrage ist in der Verwendung von FULL OUTER JOIN verdächtig. FULL OUTER JOIN wird im Allgemeinen nicht benötigt, wenn Tabellen mit wohldefinierten Schlüsseln verbunden werden.

+0

Ich habe versucht, normale Joins, aber es erzeugt das gleiche Ergebnis. Die Schlüssel sind nicht gut definiert –

+0

>>> Ihre WHERE-Klausel rückgängig macht die äußere Join <<< Das ist nicht wahr, die letzte Abfrage hat keine WHERE-Klausel überhaupt – sepupic

+0

Seine Ansichten brauchen keine vollständige Join, es ist wahr, aber wie Es hängt mit dem Endergebnis zusammen? – sepupic

0

Die Monatsansicht muss

SELECT * (includes sum) 
FROM 
Person 
FULL OUTER JOIN Profit 
ON Person.id = profit.id 
AND [DATE] BETWEEN CAST(MONTH(GETDATE()) AS VARCHAR) + '/' + '01/' + + 
CAST(YEAR(GETDATE()) AS VARCHAR) 
AND GETDATE() 
Verwandte Themen