SELECT
b.BusinessId,
b.BusinessName
FROM
tblBusiness AS b
INNER JOIN tblBusinessTagLink AS l ON l.BusinessId = b.BusinessId
INNER JOIN tblTags AS t ON t.TagId = l.TagId
WHERE
t.TagName IN ('Technology', 'Office Supplies')
GROUP BY
b.BusinessId,
b.BusinessName
이에서 둘 중 하나 범주의 모든 사업을 선택합니다. 단지 두 종류의 사람을 선택하려면, 당신은 당신이 (A m를 대표하는 세 개의 테이블을 : N의 관계) 사용되는
HAVING COUNT(*) = 2
방법을 추가 할 수있는이 작업을 해결하는 표준 방법입니다, 당신은 유지할 수 있습니다.
개인적으로 테이블 이름에 "헝가리 표기법"을 사용하지 않으며 다른 테이블이 복수형이 아닌 경우 복수형 테이블 이름 (즉, "태그"가 아닌)을 사용하지 않을 것입니다. 아래의 첫 번째 코멘트 응답
: 큰 데이터 세트에 대한
는이 쿼리의 성능 인덱스에 의존합니다. 모든 기본 키에는 자연스럽게 색인이 필요합니다. tblBusinessTagLink
에는 복합 색인에서 첫 번째로 오지 않는 필드에 대해 두 필드와 추가 색인을 모두 포함하는 복합 색인이 있어야합니다.
WHERE keywords LIKE '%technology%'
아이디어는 좋지 않습니다. 이는 필드 시작 검색 이외의 다른 조건 (예 : 데이터 집합이 커짐에 따라 성능이 급속히 저하됨)과 부분적으로 WHERE ','+keywords+',' LIKE '%,technology,%'
또는 부분 일치/가양 성을 얻을 수 있습니다.
또한 TagId
으로 쿼리하는 것이 더 효율적일 수 있습니다. 당신이 가입 전체에서 하나 개의 테이블을 제거 할 수있는이 방법 :
FROM
tblBusiness AS b
INNER JOIN tblBusinessTagLink AS l ON l.BusinessId = b.BusinessId
WHERE
l.TagId IN (1, 2)
당신은 그러나 TagName
에 의해 조회하려는 경우,이 필드에 인덱스뿐만 아니라 절대적으로 필요합니다.
헝가리 표기법과 복수형에 대한 메모에 감사드립니다. 나는 여전히 Access 데이터베이스를 구축하는 동안 배운 모든 것을 취소하려고 노력 중이다. 비즈니스 항목의 수량이 증가하면이 쿼리의 성능이 저하됩니까? 또는 선택한 태그의 수가 증가하면? 아니면 둘다? 필자는 사용자에게 5 ~ 6 개의 태그가 적용된 레코드를 선택할 수있는 옵션을 제공 할 계획입니다. 때로는 태그를 가져 와서 키워드 필드에 저장하는 것이 더 빠르지 않을지 궁금해합니다. 따라서 '% technology %'와 (과) 같은 키워드를 tblBusiness에서 b.BusinessID, b.BusinessName을 선택할 수 있습니다. – HK1
추가 의견보기 내 대답은. – Tomalak