2016-04-27 8 views
0

Ich habe zwei Tabelle wie folgt aus:zwei Felder aus derselben Tabelle mit dem Parameter

tabSubject

+-----------+--------------------+--------------------+----------------------+ 
| SubjectId | SubjectDescription | MeetingIdImportant | MeetingIdUnimportant | 
+-----------+--------------------+--------------------+----------------------+ 
| INT | NVARCHAR(100) |  INT NULL  |  INT NULL  | 
+-----------+--------------------+--------------------+----------------------+ 

tabMeeting

+-----------+-------------+ 
| MeetingId | MeetingDate | 
+-----------+-------------+ 
| INT | DATETIME | 
+-----------+-------------+ 

In meiner Anwendung ich einen Filter haben (Dropdown-Liste mit SubjectIds), die eine gespeicherte Prozedur aufruft.

+-------------+------------------------------+--------------------------------+ 
| MeetingDate | Number of important subjects | Number of unimportant subjects | 
+-------------+------------------------------+--------------------------------+ 
| 01.05.2016 |    5    |    3    | 
+-------------+------------------------------+--------------------------------+ 

Wenn kein Thema gewählt wird, werden alle möglichen Sitzungstermine haben gezeigt werden (auch wenn sie keine zugewiesen Thema:

wird die gespeicherte Prozedur, um die Daten in einem Raster wie folgt verwendet noch). Wenn ein Thema ausgewählt wird, sollten nur solche Besprechungen erscheinen, die dieses Thema als wichtiges oder unwichtiges Thema haben.

Beispiel:

I Thema "Testing" gewählt haben. Dieses Thema ist wichtig in der Sitzung mit dem Datum 04.05.2016 und unwichtig in der Sitzung mit dem Datum 11.05.2016. Jetzt erwarte ich ein Ergebnis wie folgt aus:

+-------------+------------------------------+--------------------------------+ 
| MeetingDate | Number of important subjects | Number of unimportant subjects | 
+-------------+------------------------------+--------------------------------+ 
| 04.05.2016 |    6    |    2    | 
| 11.05.2016 |    2    |    4    | 
+-------------+------------------------------+--------------------------------+ 

Dies wird mit diesem Code in meine gespeicherten Prozedur arbeiten:

SELECT meeting.MeetingId, 
    meeting.MeetingDate, 
    (SELECT COUNT(MeetingIdMS1) FROM dbo.tabSubject WHERE MeetingIdImportant = meeting.MeetingId) AS NumberOfImportantSubjects, 
    (SELECT COUNT(MeetingIdMS8) FROM dbo.tabSubject WHERE MeetingIdUnimportant = meeting.MeetingId) AS NumberOfUnimportantSubjects 
FROM dbo.tabMeeting meeting 
INNER JOIN 
(
    SELECT MeetingIdImportant MeetingId 
    FROM dbo.tabSubject 
    WHERE (@SubjectId IS NOT NULL AND SubjectId = @SubjectId) 
    UNION ALL 
    SELECT MeetingIdUnimportant 
    FROM dbo.tabSubject 
    WHERE (@SubjectId IS NOT NULL AND SubjectId = @SubjectId) 
) t ON 
    CASE 
     WHEN @SubjectId IS NOT NULL THEN t.MeetingId 
     ELSE meeting.MeetingId 
    END = meeting.MeetingId 

Aber wenn ich nicht jedes Thema gewählt haben, werden keine Daten angezeigt. Was verpasse ich?

Antwort

1

Die Tabelle t hat keine Daten, wenn @SubjectId null ist und INNER JOIN lieferte keine Daten

SELECT meeting.MeetingId, 
    meeting.MeetingDate, 
    (SELECT COUNT(MeetingIdMS1) FROM dbo.tabSubject WHERE MeetingIdImportant = meeting.MeetingId) AS NumberOfImportantSubjects, 
    (SELECT COUNT(MeetingIdMS8) FROM dbo.tabSubject WHERE MeetingIdUnimportant = meeting.MeetingId) AS NumberOfUnimportantSubjects 
FROM dbo.tabMeeting meeting 
WHERE 
    @SubjectId IS NULL 
    OR EXISTS 
    (
     SELECT * FROM tabSubject 
     WHERE 
     (
      MeetingIdImportant = meeting.MeetingId 
      OR MeetingIdUnimportant = meeting.MeetingId 
     ) AND SubjectId = @SubjectId 
    ) 
+0

@diiN_ Mit 'Exists' in' Where' Zustand anstelle von 'Inner Join' – Eric

Verwandte Themen