我对使用SQL比较陌生,但我完全坚持我正在做的事情。
我有一个代码列表,我不希望将其包含在我的数据中,但如果此代码出现在该患者的任何记录中,我希望能够排除一整天的任何内容那天。
我正在尝试的只是排除我在列表中的记录而不是完整的日期记录。
我确信这很简单,但我已经有点脑死了。
答案 0 :(得分:0)
一般来说(因为您缺少详细信息,例如您正在使用的RDBMS,您存储日期的数据类型):
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;
对于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
);