2013-07-08 6 views
0

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

VISIT ID | MRN | ORDER NUMBER | ORDER STATUS | STATUS DATETIME 
12345678 | 123 | 987654321 | ACITVE  | 2013-06-01 11:00:01.000 
12345678 | 123 | 987654321 | DISCONTINUE | 2013-06-01 11:05:00.000 
12345678 | 123 | 987654320 | ACTIVE  | 2013-06-01 11:10:00.000 
12345678 | 123 | 987654320 | IN PROGRESS | 2013-06-01 11:15:00.000 
12345678 | 123 | 987654320 | COMPLETE  | 2013-06-01 11:25:00.000 

То, что я хочу сделать, это избавиться от всех порядковых номеров, которые имеют статус заказа, как Прекратите и получить следующий вывод:

VISIT ID | MRN | ORDER NUMBER | ORDER STATUS | STATUS DATETIME 
12345678 | 123 | 987654320 | ACTIVE  | 2013-06-01 11:10:00.000 
12345678 | 123 | 987654320 | IN PROGRESS | 2013-06-01 11:15:00.000 
12345678 | 123 | 987654320 | COMPLETE  | 2013-06-01 11:25:00.000 

единственными способами я могу думать делать это, кажется, слишком сложным. Вот мой код:

DECLARE @SD DATETIME 
DECLARE @ED DATETIME 
SET @SD = '2013-06-01'; 
SET @ED = '2013-06-30'; 

-- COLUMN SELECTION 
SELECT PV.PtNo_Num AS 'VISIT ID' 
, PV.Med_Rec_No AS 'MRN' 
, PV.Adm_Date AS 'ADMIT' 
, PV.Dsch_Date AS 'DISC' 
, PV.Days_Stay AS 'LOS' 
, PV.pt_type AS 'PT TYPE' 
, PV.hosp_svc AS 'HOSP SVC' 
, SO.ord_no AS 'ORDER NUMBER' 
, SO.ent_dtime AS 'ORDER ENTRY TIME' 
, SO.svc_desc AS 'ORDER DESCRIPTION' 
, OSM.ord_sts AS 'ORDER STATUS' 
, SOS.prcs_dtime AS 'ORDER STATUS TIME' 

-- DB(S) USED 
FROM smsdss.BMH_PLM_PtAcct_V PV 
JOIN smsmir.sr_ord SO 
ON PV.PtNo_Num = SO.episode_no 
JOIN smsmir.sr_ord_sts_hist SOS 
ON SO.ord_no = SOS.ord_no 
JOIN smsmir.ord_sts_modf_mstr OSM 
ON SOS.hist_sts = OSM.ord_sts_modf_cd 

-- FILTER(S) 
WHERE Adm_Date BETWEEN @SD AND @ED 
--AND OSM.ord_sts IN ( <--COMMENTED OUT 
--'ACTIVE',    <--COMMENTED OUT 
--'IN PROGRESS',  <--COMMENTED OUT 
--'COMPLETE'   <--COMMENTED OUT 
--)      <--COMMENTED OUT 
AND pv.drg_no IN (067,068,069) 
AND SO.svc_cd IN (SVC CODES LIST) 
ORDER BY PV.PtNo_Num, SO.ord_no, SOS.prcs_dtime 

Любые предложения приветствуются.

Спасибо,

+2

ли вы делаете выбор, удаление или обновление, почему вы не можете просто WHERE OrderStatus <> 'DISCONTINUE'? – Volvox

+0

Привет @Volvox, когда я это сделал, «ORDER NUMBER», где он все еще находился в «ACTIVE», все еще появился. Если в любой момент «ORDER NUMBER» попадает в состояние «DISCONTINUE», я не хочу показывать какую-либо его историю. Причина в том, что я присоединяюсь к таблице, в которой хранится история заказа, поэтому каждый номер заказа является уникальным для пациента, а также его статус –

+1

Ahh, я думаю, я вижу, к чему вы клоните. WHERE OrderNumber NOT IN (SELECT OrderNumber FROM x WHERE OrderStatus = 'Discontinue') – Volvox

ответ

1

Я бы создать список Ordernumbers затем удалить те из набора результатов, используя ИНЕК аналогичный:

WHERE OrderNumber NOT IN 
(
    SELECT OrderNumber From smsmir.ord_sts_modf_mstr 
    WHERE OrderStatus = 'Discontinue' 
) 

Чтобы ускорить процесс, можно сначала применить любые ограничения для основного запроса в подзапросе - в зависимости от вашего размера набора результатов и ожиданий производительности, может быть даже стоит присоединиться и фильтровать в подзапросе, чтобы исключить огромный набор OrderNumbers, если они не нужны. Кроме того, может оказаться полезным заявление DISTINCT. Хотя он должен будет сортировать и фильтровать, он может быть более эффективным, чем раздутый оператор NOT IN. Возможно, вы тоже сможете инвертировать утверждение ... Я предполагаю, что у вас меньше сокращений, чем активных, но это может быть не так. Оператор IN с порядковым номером <> «Прекратить» может быть быстрее. Если есть нестрочная индикация состояния прекращения, которое было бы предпочтительнее проверки, чем строковое значение.

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