2014-12-21 3 views
1

나는이 개 테이블이 :효율적인 방법

Service_BD :

enter image description here

LOB :

enter image description here

지금에 대한 요구 사항이 industryId 등의 LOB 테이블에 중복 열을 삭제하고 Service_BD 테이블을 사용하여 industryId 및 th에 대한 LOB를 가져옵니다. LOB 테이블을 사용하여 특정 LOB의 세부 사항을 가져옵니다.

내부 조인을 사용하여 단일 SQL 쿼리를 가져 오려고하지만 결과가 이상합니다. 나는이 같은 간단한 SQL 쿼리를 실행할 때

가 :

SELECT industryId, LobId 
FROM Service_BD 
WHERE industryId = 'I01' 
GROUP BY lobId 

결과는 9 행입니다 : 이제

enter image description here

, 나는 (마이너스 LOB 컬럼의 나머지에 가입 하시겠어요 물론 떨어 뜨린 것들) LOB 세부 사항을 가져올 수 있습니다. 그래서 아래의 쿼리를 사용

SELECT * 
FROM LOB 
INNER JOIN Service_BD ON Service_BD.lobId = LOB.lobId 
WHERE Service_BD.industryId = 'I01' 
GROUP BY Service_BD.lobID 

enter image description here

내가 원하는 결과를 얻고을하지만, 이것이 가장 효율적인 방법인지 아닌지 나는 의심의 여지가있다. 나는 Service_BD와 LOB 테이블 모두에 엄청난 양의 데이터가 있기 때문에 의심 스럽지만 WHERE 조건의 복잡성을 줄이기 위해 먼저 GROUP BY Service_BD.lobID을 수행하면 감각이 생깁니다.

이 방법이 쿼리를 작성하는 올바른 방법인지 또는 동일한 방법을 사용하는 것이 더 좋은지 알고 싶습니다.

+0

검색어가 맞습니다. 약간 속도를 높이기 위해 할 수있는 한 가지는'JOIN' 절에서 'INNER JOIN Service_DB ON ServiceDB.lobID = LOB.lobID AND Service_DB.IndustryId ='I01 '과 같이'WHERE' 조건을 이동하는 것입니다. 그러나 이것은 당신이 사용하고있는 RDBMS에 의존 할 수도 있습니다. –

+2

쿼리에 GROUP BY 절에 언급되지 않은 SELECT 절의 열이 포함되어 있기 때문에 MySQL - AFAIK가 아닌 것 같습니다. 다른 RDBMS에도이 "이상한"기능이 있습니다. –

+1

@FrankSchmitt :'lobID'가 기본 키 (또는 고유 키) 인 경우 실제로 유효 (표준) SQL이고 Postgres에서도 작동합니다 (http : // stackoverflow).com/q/27561914/330315 –

답변

1

사용중인 DB 엔진에 대해 언급하지 않으므로 MySQL을 사용하고있는 것 같습니다. In most casesGROUP BYWHERE 조건을 충족하는 행에서만 수행됩니다. 따라서 GROUP BYINNER JOINWHERE 절의 가져온 결과에만 수행됩니다.

나는

SELECT * 
FROM LOB INNER 
JOIN Service_BD ON Service_BD.lobId = LOB.lobId 
WHERE Service_BD.industryId = 'I01' 
GROUP BY Service_BD.lobID 

이 쿼리의 성능을 향상 생각하지 않지만 그것은 확실히 당신의 결과에서 lobID 중복 제거합니다. 또한 HAVING 절을 소개하는 것 외에는 중복을 제거하는 다른 방법이 없지만 쿼리 성능을 향상시킬 수 있다고는 생각하지 않습니다.