2016-11-01 9 views
0

В настоящее время я использую этот запрос для запуска события клиента. Но иногда один и тот же клиент будет в результатах, потому что им назначается другой WorkOrderId, который является моим основным фильтром. Итак, я хочу расширить фильтр, чтобы также искать уникальное имя CustomerName. Другими словами, если запрос возвращает две строки с тем же именем CustomerName, то я хочу, чтобы он полностью исключал вторую строку.Удалить дубликаты из SQL Query

SELECT CustomerName, JobId, Email, CCEmail, WorkOrderId AS id 
FROM dbo.vwWorkOrderDetail 
WHERE JobStatusId=3 AND Active=1 AND LocationStopTypeId=1 
ORDER BY WorkOrderId DESC 

Я попытался с помощью DISTINCT, но я по-прежнему, чтобы получить результаты, которые включают в себя один и тот же CUSTOMERNAME в разных строках. Как настроить этот запрос, чтобы он возвращал результаты, которые передавали все условия WHERE, а затем показывали только строки с уникальным именем CustomerName?

+0

Ваш вопрос является неполным. Что вы хотите сделать с тем, что есть два файла workOrderId? –

+0

Вы всегда хотите, чтобы результат этого запроса составлял одну или нулевую строку? – JohnH

ответ

1

Пока вы работаете с WorkOrderId, DISTINCT ничего не сделает для вас. DISTINCT может только исключать дубликаты, где все столбцы, указанные в SELECT, содержат одну и ту же информацию. Таким образом, чтобы использовать DISTINCT, чтобы устранить дублирующие клиент, вы должны были бы сделать это:

SELECT DISTINCT CustomerName, JobId, Email, CCEmail 
FROM dbo.vwWorkOrderDetail 
WHERE JobStatusId=3 AND Active=1 AND LocationStopTypeId=1 
ORDER BY WorkOrderId DESC 

Лучшим способом приблизиться к этому, чтобы сохранить WorkorderID это сделать новое представление на основе базовых таблиц. Вам нужно будет решить, какой WorkOrderId из доступных WorkOrderIds вы хотите представить. Обычно это самый высокий идентификатор. Если все, что вам нужно, это сам WorkOrderId, а не детали, это на самом деле довольно просто. Обратите внимание, что приведенный ниже код является наивным примером, который предполагает, что CustomerId привязан непосредственно к рабочему заказу. Чтобы действительно ответить на это, вам необходимо предоставить код для vwWorkOrderDetail.

SELECT CustomerName, JobId, Email, CCEmail, (SELECT MAX(WorkOrderId) FROM WorkOrders WHERE CustomerID = Customers.CustomerID) AS WorkOrderID 
FROM Customers 
WHERE JobStatusId=3 AND Active=1 AND LocationStopTypeId=1 
ORDER BY WorkOrderId DESC 
+0

Gotcha. Хорошо, я посмотрел макет дизайна для представления БД, а CustomerID напрямую подключен через таблицу «Клиент». Похоже, что CustomerID и CustomerName являются единственными значениями в «Клиенте», данные электронной почты находятся в таблице «Контакт». К сожалению, это сложный вид, который, к сожалению, объединяет более 8 таблиц. Я ценю понимание и ответ, просто не уверен, что у меня есть знание SQL, чтобы ответить на другие аспекты вопроса :( – user3010456

+0

Если вы опубликуете код представления, я могу попытаться помочь. Вопросы дизайна, на которые нужно ответить, - это порядок работы для возврата, если требуется только одно, и требуются ли какие-либо детали заказа на работу, отличные от WorkOrderId. Существует множество способов достижения этого, но выбор правильного зависит от получения хороших требований. – JamieSee

0
SELECT CustomerName, JobId, Email, CCEmail, max(WorkOrderId) AS id 
FROM dbo.vwWorkOrderDetail 
WHERE JobStatusId=3 AND Active=1 AND LocationStopTypeId=1 
GROUP BY CustomerName, JobId, Email, CCEmail 
+0

Спасибо за Результаты Результаты по-прежнему показывают повторяющиеся результаты CustomerName. У результатов дублированного имени будет также другой WorkOrderId, JobId (или оба), чем первая запись для этого CustomerName. Это моя проблема. Основной фильтр сортирует 95% результатов, которые могут иметь дубликаты , поэтому я оставил попытку фильтровать оставшиеся 5% по наилучшему варианту, который у меня есть, CustomerName. – user3010456

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