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
我有一个存储过程正在为公告牌获取通信数据。默认情况下,它会查找观众部门中的所有内容。但是我允许他们 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