【问题标题】:Join two fields from same table with parameter使用参数连接来自同一个表的两个字段
【发布时间】:2016-08-21 11:46:29
【问题描述】:

我有两张这样的表:

标签主题

+-----------+--------------------+--------------------+----------------------+
| 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                |
+-------------+------------------------------+--------------------------------+

如果没有选择任何主题,则必须显示所有可能的会议日期(即使他们还没有指定任何主题)。如果选择了一个主题,那么只有那些将该主题作为重要或不重要主题的会议才会出现。

例子:

我选择了主题“测试”。这个主题在日期为 04.05.2016 的会议中很重要,在日期为 11.05.2016 的会议中不重要。现在我期待这样的结果:

+-------------+------------------------------+--------------------------------+
| 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

但是当我没有选择任何主题时,不会显示任何数据。我错过了什么?

【问题讨论】:

    标签: sql-server tsql stored-procedures sql-server-2014


    【解决方案1】:

    如果@SubjectId为空且INNER JOIN没有返回数据,则表t没有数据

    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
        )
    

    【讨论】:

    • @diiN_ 在Where 条件下使用Exists 而不是使用Inner Join
    猜你喜欢
    • 2021-10-13
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    相关资源
    最近更新 更多