2016-04-27 46 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

相关问题