Table 中的 TSQL 不同列

TSQL Distinct Column in Table

我有一个存储过程正在为公告牌获取通信数据。默认情况下,它会查找观众部门中的所有内容。但是我允许他们 select 多个部门查看公司周围的内容,如果他们选择的话..

我面临的问题是他们select的每个部门都多次提供相同的记录。

在我的查询中,在 WHERE 子句中,我有一个声明 AND aud.Department IN (SELECT department FROM @departments).

这是错误发生的地方。对于该临时 table 中的每个部门,它 returns 相同的记录。

我怎样才能 select 只从他的 table 中获取不同的记录? commID是身份

 -- Fetch our communicatons based on certain criteria
            SELECT   sub.commID,
                     sub.status,
                     sub.content,
                     CONVERT (VARCHAR (100), sub.distributionDate, 101) AS distributionDate,
                     sub.subject,
                     a.FirstName + ' ' + a.LastName AS approver,
                     b.FirstName + ' ' + b.LastName AS poc,
                     b.NTID AS NTID,
                     CONVERT (VARCHAR (100), sub.dateApproved, 101) AS dateApproved,
                     (SELECT department
                      FROM   comm_audience
                      WHERE  commID = sub.commID
                      FOR    XML PATH ('departments'), ELEMENTS, TYPE, ROOT ('audience'))
            FROM     comm_submissions AS sub
                     INNER JOIN
                     comm_medium AS med
                     ON sub.commID = med.commID
                     INNER JOIN
                     comm_mediumOptions AS mop
                     ON med.mediumID = mop.mediumID
                     INNER JOIN
                     comm_audience AS aud
                     ON sub.CommID = aud.commID
                     LEFT OUTER JOIN
                     dbo.EmployeeTable AS a
                     ON sub.approver = a.QID
                     LEFT OUTER JOIN
                     dbo.EmployeeTable AS b
                     ON sub.poc = b.QID
            WHERE    mop.mediumTitle IN ('Digital eBoard') -- Only eBoard Comms
                     AND aud.Department IN (SELECT department FROM @departments) -- Viewers Department must be in the audience
                     AND sub.commLocation = @locale -- The comm locale must be the viewers locale
                     AND sub.status IN ('Completed') -- Only show Approved or Completed Comms
            ORDER BY sub.distributionDate DESC

--更新

-- Create a temp table of our department(s) we are viewing
DECLARE @departments as TABLE (department varchar(100))
INSERT INTO @departments(department)
SELECT  ParamValues.x1.value('department[1]', 'varchar(100)')
FROM    @xml.nodes('/root/data/departments/audience') AS ParamValues(x1);

据我了解,您的 table comm_audience 包含您需要过滤的部门,但每个 commID 可以有多行。因此,在 where 子句中尝试过滤掉不在您的部门列表中的 commID,如下所示:

     SELECT   sub.commID,
         sub.status,
         sub.content,
         CONVERT (VARCHAR (100), sub.distributionDate, 101) AS distributionDate,
         sub.subject,
         a.FirstName + ' ' + a.LastName AS approver,
         b.FirstName + ' ' + b.LastName AS poc,
         b.NTID AS NTID,
         CONVERT (VARCHAR (100), sub.dateApproved, 101) AS dateApproved,
         (SELECT department
          FROM   comm_audience
          WHERE  commID = sub.commID
          FOR    XML PATH ('departments'), ELEMENTS, TYPE, ROOT ('audience'))
FROM     comm_submissions AS sub
         INNER JOIN
         comm_medium AS med
         ON sub.commID = med.commID
         INNER JOIN
         comm_mediumOptions AS mop
         ON med.mediumID = mop.mediumID

         --Don't join here
         --INNER JOIN
         --(SELECT DISTINCT commID FROM comm_audience) AS aud
         --ON sub.CommID = aud.commID

         LEFT OUTER JOIN
         dbo.EmployeeTable AS a
         ON sub.approver = a.QID
         LEFT OUTER JOIN
         dbo.EmployeeTable AS b
         ON sub.poc = b.QID
WHERE    mop.mediumTitle IN ('Digital eBoard') -- Only eBoard Comms

         --Comment this out
         --AND aud.Department IN (SELECT department FROM @departments) -- Viewers Department must be in the audience

         --What you want is to filter out an commID that aren't in your list of departments so try this
         AND sub.CommID IN (SELECT DISTINCT commID FROM comm_audience WHERE Department IN (SELECT department FROM @departments))

         AND sub.commLocation = @locale -- The comm locale must be the viewers locale
         AND sub.status IN ('Completed') -- Only show Approved or Completed Comms
ORDER BY sub.distributionDate DESC