2016-04-27 48 views
0

我有兩個表是這樣的:加入來自同一個表中的兩個字段與參數

tabSubject

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

tabMeeting

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

在我的應用程序有一個過濾器(下拉列表與SubjectIds)調用存儲過程。

的存儲過程是使用在這樣的表格顯示數據:

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

如果選擇沒有問題,所有可能的會議日期已被顯示(即使他們沒有任何分配主題然而)。如果選擇了一個主題,那麼只有那些會議將這個主題視爲重要或不重要的主題。

例如:

我選擇了主題「測試」。這個主題在2016年5月4日的會議中很重要,在2016年5月11日的會議中並不重要。現在,我希望結果是這樣的:

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

這正與該代碼在我的存儲過程:

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 

但是,當我不選擇任何問題,沒有顯示數據。我錯過了什麼?

回答

1

桌子T沒有數據如果@SubjectId爲空和INNER JOIN返回任何數據

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_在'Where'條件使用'Exists'而不是使用'內Join' – Eric

相關問題