2009-05-13 11 views
0

이 쿼리가 0보다 큰 값을 반환하는 경우에만 tblProperty.ID를 선택하려고합니다.SQL 하위 쿼리 질문

SELECT  
    COUNT(tblProperty.ID) AS count 
FROM   
    tblTenant AS tblTenant 
    INNER JOIN tblRentalUnit 
     ON tblTenant.UnitID = tblRentalUnit.ID 
    INNER JOIN tblProperty 
     ON tblTenant.PropertyID = tblProperty.ID 
     AND tblRentalUnit.PropertyID = tblProperty.ID 
WHERE tblProperty.ID = x 

여기서 x는 찾고있는 부모의 tblProperty.ID와 같습니다. 나는 'x'가 무엇인지 모른다.

어떻게해야합니까?

Database Structure: 
tblTenant: 
    ID 
    PropertyID <--foreign key to tblProperty 
    UnitID  <--foreign key to tblRentalUnit 
    Other Data 
tblProperty: 
    ID 
    Other Data 
tblRentalUnit: 
    ID 
    PropertyID <--foreign key to tblProperty 
    Other Data 

쿼리에 대한 설명 :
쿼리는 테넌트가있는 임대 단위가있는 속성 만 선택합니다.

+0

왜 당신은 그들이 이미 같은 이름을 가진 모든 테이블을 앨리어싱입니까? 요점 외에는 다소 다르지 않습니까? :) – Tomalak

+0

당신이 이런 유형의 질문을 할 때, 당신의 테이블과 관계가 어떻게 설정되어 있는지 알면 좋을 것입니다. 왜냐하면 이걸 보면 당신은 하나 이상의 결과를 얻지 못할 것이라고 말하고 싶기 때문입니다. 그것을 하나의 속성 id (X)로 제한한다. 그래서 ... 왜 단 하나의 결과를 반환 할 때 PropertyID를 포함하지 않을까요? 이 쿼리를 너무 복잡하게 만드는 것처럼 보입니다. – TheTXI

+0

@Tomalak Crystal Reports는 그렇게하지 않았습니다. 나는 방금 그 길을 떠났다. – Malfist

답변

3
SELECT  
    tblProperty.ID 
FROM   
    tblTenant AS tblTenant 
    INNER JOIN tblRentalUnit AS tblRentalUnit 
     ON tblTenant.UnitID = tblRentalUnit.ID 
    INNER JOIN tblProperty AS tblProperty 
     ON tblTenant.PropertyID = tblProperty.ID 
     AND tblRentalUnit.PropertyID = tblProperty.ID 
GROUP BY tblProperty.ID 
HAVING COUNT(tblProperty.ID) > 1 

해야합니다.

+0

'x'는 무엇으로 바꿉니 까? – Malfist

+0

정확하게 이해한다면 그룹이 필요합니다. 카운트가 1보다 큰 그룹 (groupd by tblProperty.id) 만 필요합니다. – pgb

+0

사실 훨씬 간단한 솔루션을 발견했습니다. 다음 주석에 게시 – Malfist

0

GROUP BY 절? 임시 표 &을 선택한 다음 #tmp에서 SELECT를 선택하는 것이 더 쉽습니다.

1

쿼리 끝에 다음을 추가하십시오. 이것은 당신이 아무것도 카운트가있는 경우 반환하고 싶지 않은 것으로 가정 1

HAVING COUNT(tblProperty.ID) > 1 
0

0 무슨 말 HAVING COUNT(tblProperty.ID) > 1SELECT tblProperty.ID로 시작을 변경 및 추가에 대한? 나는 당신의 AS 절을 이해하지 인정하지만 - 그들이 나에게 완전히 중복 것, 각자 ...

+0

, 크리스탈 리포트는 나를 위해 그것을했다. 그리고 나는 그들을 결코 꺼내지 않았다. – Malfist

2

쿼리는 다음과 같습니다 세입자가 살고있는 임대 주택이 속성 만 선택 그들.

SELECT 
    p.ID 
FROM 
    tblProperty    AS p 
    INNER JOIN tblRentalUnit AS u ON u.PropertyID = p.ID 
    INNER JOIN tblTenant  AS t ON t.UnitID  = u.ID 
GROUP BY 
    p.ID 

이 그것을해야한다. 내부에서 명시 적으로 에 조인하지 않는 경우은 참조되지 않은 레코드를 선택합니다. 즉, 테넌트가있는 임대 단위가있는 속성 만 선택합니다.

tblTenant이 (가) tblProperty에 링크 된 이유가 확실하지 않습니다. 이 링크는 세입자 -> 임대 유닛 -> 소유지에서 나오는 것처럼 보이기 때문에 이것이 필요하지 않은 것처럼 보입니다.

+0

이것은 또한 작동합니다. – Malfist

0

사실,이 작품 :

SELECT DISTINCT 
    p.ID 
FROM   tblProperty AS p LEFT OUTER JOIN 
         tblTenant AS t ON t.PropertyID = p.ID 
WHERE  (t.UnitID IS NOT NULL) 
+0

내 쿼리가 작동하는지 확인할 수 있습니까? 그리고 데이터 레이아웃에 대한 질문에 대한 답을 해주십시오. 감사합니다 :) – Tomalak

+0

당신이 처음이 아니었기 때문에 대답을주지 않았습니다. 그러나 나는 당신에게 자격이 된 upvote를주었습니다 :) – Malfist

+0

이것이 나쁜 해결책이라는 것을 이해 하시겠습니까? 왼쪽 조인을 사용하는 경우 id가 null 인 인스턴스를 요청하지 않는 한 where 테이블에서 refernce을 두어 테이블을 완전하게 무효화합니다 (두 번째 테이블이 아닌 첫 번째 테이블에 레코드가 제공됨). 그래서 내부 조인은 퍼포먼스와 단순성면에서 더 좋을 것입니다. 또한 정말로 하나 이상의 부동산에 세입자가 살고 있습니까? 그렇지 않다면 뚜렷한 시간을 낭비 할 필요가 없습니다. – HLGEM