2015-06-04 3 views
0

Вот результаты (не имеют 10 точек репутации). Я хотел бы исключить «дублирование», обозначенное «***». Я не уверен, как это сделать.SQL удаляет строки с одинаковыми данными (не дублирует)

Client Name----Medication 1------Medication 2 
John    Adderall XR  Concerta 
John    Adderall XR  Intuniv ER 
John    Adderall XR  Risperdal *** 
John    Adderall XR  Prazosin 
John    Risperdal   Concerta 
John    Risperdal   Intuniv ER 
John    Risperdal   Adderall XR *** 
John    Risperdal   Prazosin 

А вот мой запрос

create table #temp5 (medCode int, medText varchar(500), clientid int) 

insert into #temp5 (medCode, medText, clientid) 
select distinct 
    ClientMedications.MedicationNameId, 
    dbo.GetMedicationName(ClientMedications.MedicationNameId), 
    Clients.ClientId 
from 
    ClientMedications 
    join Clients on ClientMedications.ClientId = Clients.ClientId 



select distinct 
    c.LastName + ' ,' + c.FirstName as [Client Name], 
    dbo.GetMedicationName(cm.MedicationNameId) as [Medication 1], 
    t1.medText as [Medication 2], 
    cmi.InteractionLevel, 
    cmi.ClientMedicationId2 
from 
    Clients as c 
    join ClientMedications as cm on c.ClientId = cm.ClientId 
    join ClientMedicationInteractions as cmi 
     on cm.ClientMedicationId = cmi.ClientMedicationId1 
    join #temp5 as t1 on t1.clientId = c.ClientId 
where 
    t1.medText != dbo.GetMedicationName(cm.MedicationNameId) 
+1

Почему у вас есть два препарата в двух отдельных таблицах в первую очередь? – GolezTrol

+0

И если да, почему у вас все еще есть несколько строк для одного и того же клиента? – Siguza

+0

Надеюсь, ваши столы не очень большие. У вас есть предикаты nonSARGable в ваших предложениях where и scalar. Это очень плохо с точки зрения производительности. –

ответ

-1

Если вы хотите, чтобы удалить второй повторяющиеся строки (или первый), то вам не нужно порядок лекарств. В этом случае вы можете поместить результаты из запроса в другой временной таблицы говорят #temp6 и использовать case заказать две колонки, как в этом примере:

SELECT distinct 
    Name, CASE WHEN med1 > med2 
      THEN med1 + ', ' + med2 
      ELSE med2 + ', ' + med1 
      END as meds 
FROM 
    (SELECT 'John' as Name, 'Amerral' as med1, 'Metteral' as med2 
    UNION 
    SELECT 'John', 'Metteral', 'Amerral') medss 
0

Создание альфа отсортированный список лекарства для каждой строки, а затем удалите отсортированный список.

WITH medicationsWithAlphaList 
AS 
(
    SELECT 
     clientname, 
     medication1, 
     medication2, 
     CASE 
      WHEN medication1<medication2 
       THEN medication1 +', ' + medication2 
      ELSE 
       medication2 + ', ' + medication1 
     END AS medsAlphaList 
    FROM 
     clientmedications; 
) 
SELECT 
    clientname, 
    medication1, 
    medication2 
FROM 
    medicationsWithAlphaList 
WHERE 
    medsAlphaList IN 
     (
     SELECT 
      medsAlphaList 
     FROM 
      medicationsWithAlphaList 
     GROUP BY 
      medsAlphaList 
     HAVING 
      COUNT(*)=1 
     ); 
+0

Проблема заключается в том, что таблица ClientMedications не содержит так называемого лекарства 1 и лекарства 2. Я создал эту идею ради взаимодействия между двумя препаратами. Строка в этой таблице состоит из клиента и лекарства, с несколькими строками, если клиент находится на более чем одном лекарственном средстве. –

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