2015-03-20 5 views
-1

У меня есть хранимая процедура, которая извлекает данные связи для доски объявлений. По умолчанию он просматривает весь контент, расположенный в отделе зрителей. Однако я разрешаю им выбирать несколько отделов, чтобы увидеть контент вокруг компании, если они захотят ..TSQL Distinct Column в таблице

Проблема, с которой я сталкиваюсь, заключается в том, что для каждого отдела, который они выбирают, он предоставляет одну и ту же запись несколько раз.

В моем запросе, в пункте WHERE, у меня есть заявление, в котором говорится: AND aud.Department IN (SELECT department FROM @departments).

Здесь происходит ошибка. Для каждого отдела в этой временной таблице он возвращает одну и ту же запись.

Как я могу выбрать только отдельные записи из его таблицы? 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); 
+0

где вы заполнили @departments, показать его, (не тот, кто вниз голосовал) – jfun

+0

Пожалуйста показать наименьшее возможный пример, который воспроизводит вашу проблему. –

+0

Обновлено, чтобы включить ДОПОЛНИТЕЛЬНУЮ информацию, чем то, что у меня было :) – SBB

ответ

2

Так что я понимаю, что ваша таблица comm_audience содержит отделы, необходимые для фильтрации, но вы можете иметь несколько строк на commID , Таким образом, в пункте где попробовать отфильтровывая 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 
+0

Хотя кажется, что это будет работать логически, я все равно получаю дубликаты результатов в ответе. В этой проблеме есть две таблицы. 'comm_submissions' - это то, что содержит данные представления, а его первичный ключ -' commID'. Существует еще один вызов, называемый 'comm_audience', который содержит' commID' и любые отделы, которые они выбрали для отображения этого сообщения. Таким образом, в таблице представлений есть одна запись в таблице представлений. – SBB

+0

Хорошо, я думаю, что на этот раз. Вы только хотите, чтобы commID, который находится в отделах, так что я редактировал свой код, поэтому вы хотите сделать это в разделе where, а не в join. Попробуйте. – Stephan

+1

Это, похоже, устранило проблему, спасибо огромное! – SBB

Смежные вопросы