从列表中排除记录

时间:2015-04-02 15:16:41

标签: mysql sql

我对使用SQL比较陌生,但我完全坚持我正在做的事情。

我有一个代码列表,我不希望将其包含在我的数据中,但如果此代码出现在该患者的任何记录中,我希望能够排除一整天的任何内容那天。

我正在尝试的只是排除我在列表中的记录而不是完整的日期记录。

我确信这很简单,但我已经有点脑死了。

3 个答案:

答案 0 :(得分:0)

一般来说(因为您缺少详细信息,例如您正在使用的RDBMS,您存储日期的数据类型):

  1. 您需要能够确定两条记录是否来自同一日期。如何执行此操作取决于RDBMS和数据类型。
  2. 您可以使用LEFT OUTER JOINNOT EXISTS运算符来识别符合条件的记录:
  3. 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;
    

    对于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');
    

    对于每个值,这将扫描表中的禁止值,并排除发现命中的行。这种方法效率较低,如果您的数据集特别大,可能会令人望而却步,但通常更容易理解并可能适用于您的应用程序。

答案 1 :(得分: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)
                )
)

答案 2 :(得分: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
);