2015-04-02 4 views
0

Я относительно новичок в использовании SQL, но я полностью зациклен на том, что я делаю.Исключая записи из списка

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

То, что я пытаюсь, исключает только запись, которую я имею в списке, но не полную запись дня.

Я уверен, что это просто, но я немного погубил мозг.

+4

Не могли бы вы дать краткое описание таблиц, которые вы используете. Это единая таблица с CODE, PATIENT, DATE, other-info –

ответ

0

Вообще говоря (как вам не хватает на деталях, например, какие RDBMS вы используете, какой тип данных вы храните ваши даты в):

  1. Вы должны быть в состоянии определить, являются ли две записи с той же даты. Как вы это сделаете, это будет зависеть от РСУБД и типа данных.
  2. Вы можете использовать либо LEFT OUTER JOIN или оператор NOT EXISTS для идентификации записей отвечает вашим критериям:

LEFT OUTER JOIN

SELECT r1.your_field... 
FROM your_table r1 LEFT OUTER JOIN your_table r2 
    ON r1.id_field != r2.id_field AND r1.date = r2.date AND 
    r2.code_field = 'forbidden value' 
WHERE r1.code_field != 'forbidden value' AND r2.code_field IS NULL; 

This попытки, для каждой записи в your_table, чтобы найти другую запись в таблице с запрещенным значением. Указав, что поле code_field имеет значение null, такие записи исключаются.

NOT EXISTS

SELECT r1.your_field... 
FROM your_table r1 
WHERE r1.code != 'forbidden value' AND 
    NOT EXISTS (
    SELECT 1 FROM your_table r2 
    WHERE r1.date = r2.date AND r2.code = 'forbidden value'); 

Это, для каждого значения, сканирует таблицу для запрещенного значения и исключает строки, где он находит удар. Этот метод менее эффективен и может быть запретительным, если ваш набор данных особенно велик, но, как правило, более понятен и может работать для вашего приложения.

0

Этот подход может получить то, что вам нужно:

SELECT 
    * 
FROM 
    MyTable t 
WHERE 
NOT EXISTS 
(
    SELECT 
     1 
    FROM 
     MyTable t2 
    WHERE 
     t2.PatientID = t.PatientID 
     AND t2.LogDate = t.LogDate 
     AND EXISTS 
      (SELECT 1 FROM MyTable t3 
       WHERE 
        t3.PatientID = t2.PatientID 
        AND t2.LogDate = t3.LogDate 
        AND t3.BadCode IN (867,5309) 
       ) 
) 
0

А вот другой подход с использованием CTE:

WITH BadPatientDates AS (
SELECT 
    PatientID, 
    LogDate 
FROM 
    MyTable 
WHERE 
    BadCode IN (867,5309) 
) 

SELECT 
    * 
FROM 
    MyTable t 
WHERE 
NOT EXISTS 
(SELECT 1 
FROM 
    BadPatientDates b 
WHERE 
    t.PatientID = b.PatientID 
    AND t.LogDate = b.LogDate 
); 
Смежные вопросы