쿼리를 쓰는 방법은 선택되지 않은 레코드를 반환합니다

StackOverflow https://stackoverflow.com/questions/1616969

  •  06-07-2019
  •  | 
  •  

문제

나는 심리 테스트 응용 프로그램을 작성했는데, 여기서 사용자에게 단어 목록이 제시되고 10 단어를 선택해야합니다. 흠뻑 자신을 묘사 한 다음 자신을 부분적으로 묘사하는 단어와 자신을 묘사하지 않는 단어를 선택하십시오. 응용 프로그램 자체는 잘 작동하지만 메타 데이터 가능성을 탐색하는 데 관심이있었습니다. 첫 번째 범주에서 가장 자주 선택된 단어와 첫 번째 범주에서 선택된 단어가 선택된 단어가 선택되지 않았습니다. 첫 번째 쿼리는 문제가 아니었지만 두 번째 (단어가 선택되지 않은)는 나를 괴롭 혔습니다.

테이블 구조는 다음과 같습니다.

table words: id, name
table choices: pid (person id), wid (word id), class (value between 1-6)

아마도 그 대답은 단어와 선택 사이의 왼쪽 결합과 관련이 있지만, 선택 .class = 1- 여기서 수정 된 진술이 있어야합니다. 그리고 이것은 나에게 문제를 일으킨다. 같은 글을 쓰고 있습니다

select words.name
from words left join choices
on words.id = choices.wid
where choices.class = 1
and choices.pid = null

데이터베이스 관리자가 아무데도 긴 여행을 떠나게합니다. 나는 Delphi 7과 Firebird 1.5를 사용하고 있습니다.

Tia, No'am

도움이 되었습니까?

해결책

어쩌면 이것은 조금 더 빠릅니다 :

SELECT w.name
FROM words w
WHERE NOT EXISTS
   (SELECT 1
    FROM choices c 
    WHERE c.class = 1 and c.wid = w.id)

다른 팁

그런 일은 트릭을 수행해야합니다.

SELECT name
FROM words
WHERE id NOT IN
   (SELECT DISTINCT wid   -- DISTINCT is actually redundant
    FROM choices 
    WHERE class == 1)
SELECT words.name
FROM
    words
    LEFT JOIN choices ON words.id = choices.wid AND choices.class = 1
WHERE choices.pid IS NULL

색인이 있는지 확인하십시오 choices (class, wid).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top