2014-06-16 5 views
3

아주 간단한 질문입니다. 내가하고 싶은 일은 하나의 테이블에서 모든 열을 선택하고 다른 테이블에서 하나의 열 (여러 개의 일치하는 행을 가질 수 있음)을 선택하는 것입니다.집계가있는 다중 테이블 조인 (mssql/sql 서버)

예 :

table ta (eid, uid, name, year, etc, etc, etc) 
table tb (eid, uid, name, year, amount, etc, etc) 

eid - 두 테이블 사이에 일치하지 않습니다 uid, name, year - 간단한

그래서 나는 테이블 ta에서 모든 열을 빼 할 두 테이블에 걸쳐 일치 :

select * from ta where eid='value'; 

테이블 tb에서 금액 열에 가입하고 싶습니다. y 결과 집합, 간단 :

select a.*, b.amount 
from ta a 
inner join tb b on a.year=b.year 
where a.eid='value'; 

멋지다. 하지만 테이블 tb에 여러 행이 있으면 어떻게됩니까?

Column 'ta.eid' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

그래서 내가 추가 :

select a.*, sum(b.amount) 
from ta a inner join tb b on a.uid=b.uid 
where a.year='value'; 

나에게 다음과 같은 오류를 제공합니다 :

select a.*, sum(b.amount) 
from ta a inner join tb b on a.uid=b.uid 
where a.year='value' group by ta.uid; 

을 그리고 난 같은 오류가

실행!

그러나, 나는 내 쿼리를 변경하는 경우 :

select a.uid, a.year, sum(b.amount) 
from ta a inner join tb b on a.uid=b.uid 
where a.year='value' 
group by ta.uid, ta.year; 

그것은 작동하지만, 지금은 그 대신 내가 원하는 모든 열의 세 개의 열이 있습니다.

그래서이 시점에서 내 질문이됩니다 : 나를 수동으로 GROUP BY 절을 사용하여 두 테이블에서 끌어 오기 원하는 모든 열을 입력하는 이외의이 쿼리 구조화 더 나은, 깨끗한 방법 있습니까?

+0

이 (http://sqlblog.com/blogs/aaron_bertrand/를 [이 생산 코드에'SELECT * '를 사용하는 것은 좋은 방법이 아닙니다] 아카이브/2009/10/10/bad-habits-to-kick-using-select-omitting-the-column-list.aspx) 쿼리 작성시 30 초를 절약 할 수 있지만 장기적으로는 더 많은 비용이 발생할 수 있습니다. – GarethD

+0

하나의 테이블에서'Select * '를 사용하는 이유는 97 %의 컬럼이 데이터베이스의 테이블 레코드를 업데이트하는 업데이트 폼으로 채워지기 때문입니다. – iiminov

+0

사실 제 질문은 의미가 있습니까? 조금 더 정교하거나 더 나은 테이블 열 구조 또는 다른 것을 제공해야합니까? – iiminov

답변

7

당신은 하위 쿼리에 preaggregate 수 있습니다 : 그것은 가치가 무엇인지에 대한

select a.*, b.sumb 
from ta a left join 
    (select b.uid, sum(b.amount) as sumb 
     from tb b 
     group by b.uid 
    ) b 
    on a.uid=b.uid 
where a.year = 'value'; 
+0

흥미 롭지 만 집계 함수 나 GROUP BY 절에 포함되지 않았기 때문에 'Column'b.uid '가 선택 목록에 유효하지 않다는 오류가 발생합니다.' 사실 양은 상점에'varchar' 형식의 문자열이 있기 때문에 내가'합시다 (캐스팅 (돈으로) 돈))는 어리 석다. – iiminov

+0

@GarethD. . . 고맙습니다. 신비가 풀렸다. –

+0

실제로'group by b.uid'는 저를 괴롭히는 오류를 해결했습니다. 건배. – iiminov