2017-01-23 8 views
0

실례합니다. 나는 특정 데이터베이스 쿼리로 어떤 일이 벌어지고 있는지를 이해하는 시간을 갖고있다. 불행히도 저를 위해이 쿼리를 사용하여 수행 할 작업 목록을 만들고 이해할 수없는 이유로 작업이 중단됩니다. 내 쿼리의 "미니"버전을 디버깅하려고했습니다.데이터베이스 쿼리에 미쳐 간다

나는 무엇을 찾으려고하는지 설명하겠습니다. 우리의 실습은 기본적으로 의학 개업의와 만나는 "시험"을 가지고 있습니다. 우리는 이러한 시험 중 일부를 청구하며 우리는 원장 테이블에 청구되는 것을 추적합니다. ,

이제 (우리가 법안을 처리 할 때 즉, 우리는 원장에 삽입 할) 나는 쿼리 할 경우 : 이것은 당신이 예상 정확히 어떤 결과

SELECT Patient.PatUnique, 
     Exam.ExamUnique, 
     Exam.[Date], 
     Patient.Last, 
     Patient.First 

FROM Patient 
INNER JOIN Exam ON Patient.PatUnique = Exam.PatUnique 

: 환자의 목록을 날짜와 ExamUnique 숫자 (Exam 테이블의 키) 나는과 같이 쿼리를 수정하면

는하지만 :

SELECT Patient.PatUnique, 
     Exam.ExamUnique, 
     Exam.[Date], 
     Patient.Last, 
     Patient.First 

    FROM Patient 
    INNER JOIN Exam ON Patient.PatUnique = Exam.PatUnique 
    WHERE Exam.ExamUnique NOT IN (SELECT Ledger.ExamUnique FROM Ledger) 

을 나는 기록을 얻을. 반면에 을 알고을 입력하면 테이블에없는 Exam.ExamUnique이 있습니다. X으로 익명으로 처리하십시오. 나는 달렸습니다 :

SELECT Ledger.ExamUnique FROM Ledger WHERE Ledger.ExamUnique = X 

결과가 없습니다. 그래서 X이 거기에 없습니다.

무엇이 누락 되었습니까? 누군가가 도움이 될 것입니다 생각하기 때문에 여기에

, 일부 샘플 데이터입니다 :

Patient.PatUnique  Patient.Last  Patient.First 
1      Smith    Adam 
2      Jones    Sarah 

Exam.ExamUnique  Exam.PatUnique  Exam.Date 
1     1     01012016 
2     1     01022016 
3     2     01032016 

Ledger.ExamUnique 
1 
2 
쿼리의

예상 결과 :

Patient.PatUnique Exam.ExamUnique Exam.Date Patient.Last Patient.First 
2     3    01032016 Jones   Sarah 

실제 결과 :

0 records 
+2

샘플 데이터와 해당 데이터의 예상 출력이 누락되었습니다. 디버깅에 도움이되는 조건을 생성 할 수없는 경우 쿼리의 문제점을 파악하는 방법은 무엇입니까? 또한 WHERE에서 NOT IN을 사용하는 대신 OUTER JOIN을 사용하고 Ledger.ExamUnique가 NULL 인 WHERE LEREger를 사용할 수 있습니다. NOT IN을 만족시키기 위해 각 행에서 SELECT를 실행하는 것보다 훨씬 빠릅니다. –

+0

HIPAA에 우려가 있습니다. 내부 키를 멀리 줄 수도 없습니다. 내 논리를 확인할 수 있습니까? – nomen

+0

외부 조인과 IS NULL은 흥미로운 아이디어입니다. 나는 그것을 시도 할 것입니다. – nomen

답변

0

주석 기 매우 유용하게를 내 검색어를 다음으로 변환 할 것을 제안했습니다 :

SELECT Patient.PatUnique, 
     Exam.ExamUnique, 
     Exam.[Date], 
     Patient.Last, 
     Patient.First 

FROM Patient 
INNER JOIN Exam ON Patient.PatUnique = Exam.PatUnique 
LEFT OUTER JOIN Ledger ON Exam.ExamUnique = Ledger.ExamUnique 
WHERE Ledger.ExamUnique IS NULL 

이것은 논리적으로 디버깅하려는 원래 쿼리와 동일하며 작동합니다. 분명히 첫 번째 쿼리는 Advantage Database에서 버그를 발생 시켰습니다. 논리적으로 동일한 쿼리가 동일한 결과를 생성해야하기 때문입니다 (그러나 그렇지 않습니다).

주석 작성자는 원래 쿼리에서 NULL과의 비교를 암시 적으로 수행했기 때문에 쿼리가 논리적으로 동등하지 않다고 지적했습니다. 새 쿼리는 IS NULL과의 명시 적 비교를 수행하므로 원래 쿼리의 버그를 일으키는 정의되지 않은 동작을 방지합니다.

+3

만약 당신이 여전히 관심이 있다면 그것은 틀린 것이 었습니다. 여기에 있습니다 : 문제는 레코드 NULL Ledger.ExamUnique 값 때문이었습니다. 'WHERE Exam.ExamUnique NOT IN (SELECT Ledger.ExamUnique FROM Ledger WHERE ExamUnique NOT NULL) '을 사용하도록 쿼리를 수정하면 작동합니다. 관심있는 경우 NULL로 IN/NOT을 Google에 입력 할 수 있습니다. – cha

+0

@cha : 감사합니다. – nomen