2011-08-04 4 views
0

부모가 일치하는 모든 부모와 일치하는 부모 행과 일치하는 SQL 쿼리를 MS SQL Server 2008에 작성하려고합니다.모든 어린이가 일치하는 부모 찾기

ParentTable: 
    ParentID, Item, Price 

ChildTable: 
    ChildID, ParentID, Accessory, Price 

내가 부모 항목과 가격에 일치 ParentIDs의 그룹화를 얻으려면 그들이 액세서리에 맞게 각각의 아이들의 같은 번호를 가지고 :

나는이 기본 테이블 구조를 가지고 가정 및 가격. 예를 들어

:

ParentTable: 
--------------------- 
1, "Computer", 1000 
2, "Stereo", 500 
3, "Computer", 500 
4, "Computer", 1000 

ChildTable: 
--------------------- 
1, 1, "Mouse", 10 
2, 1, "Keyboard", 10 
3, 2, "Speakers", 50 
4, 3, "Keyboard", 10 
4, 3, "Mouse", 10 
5, 4, "Keyboard", 10 
6, 4, "Mouse", 10 

예상되는 결과는이 1, 4는 동일하고 2, 3 독특한 것을 ParentID을 의미하는 것이 무엇인가

ParentID, Grouping 
--------------------- 
1, 1 
2, 2 
3, 3 
4, 1 

처럼 될 것입니다. 필자는 일치하는 부모 목록을 얻는 한 결과의 형식에 대해 정말로 신경 쓰지 않습니다.

.net에서이 중 일부 또는 전부를 수행하는 것에 반대하지 않습니다.

+0

데이터베이스 플랫폼은 무엇입니까? – Randy

+0

예제에 PName 및 PDate라는 열이 없으므로 예상 결과를 조금 더 검토하고 설명 할 수 있습니까? – ingo

+0

이것은 SQL Server에 있습니다. 질문을 좀 더 명확하게 편집했습니다. – BFreeman

답변

0

귀하의 질문에 약간 모호하지만 어쨌든 나는 그것을 줄 것이라고 생각했습니다.

여기에 있습니다. 자유형 SQL. 일부 DML에 액세스하지 않고도 정확하게 얻을 수 없습니다.

그래서 내 일반적인 접근 방식이 될 것입니다. 이것은 SQL Server, 아마도 오라클에서도 잘 작동 할 것입니다. 나는 이것이 완벽하다고 주장하지 않는다. 내 정신 스키마가 정확히 일치하지 않습니다, 나는 그것을 독자를위한 운동으로 남겨 둘 것입니다. 나는 그것을 똑바로 입력했다.

SELECT DISTINCT p.id,p.name,p.dte,q.cnt 
FROM parent p 
JOIN 
(
    select p.id, p.dte, count(*) cnt 
    from parent p 
    join child ch 
    on ch.pid = p.id 
    group by p.id, p.dte 
) q 
ON p.id=q.id and p.dte=q.dte 
GROUP BY p.id,p.name,q.cnt 
ORDER BY p.id,p.name,q.cnt 

btw : 질문이 약간 모호하다.


UPDATE :

이 함수는 자식 행에 대한 promissing 보이는 당신이 임시 테이블이 할 수있는 경우 방향

http://sql-ution.com/function-to-convert-rows-to-csv/

+0

모호한 점에 대해 사과드립니다. 이것은 거의 효과가 있지만 어린이의 수가 유일한 관심사는 아닙니다. 그들은 각각 일치해야합니다. – BFreeman

+0

순서가 지정된 하위 ID 벡터가있는 경우 비교를 수행 할 수 있습니다. 탐색 할 수있는 방법 중 하나는 SQL 피벗 명령 중 일부입니다. 더 나은 옵션은 함수를 통해 정렬 된 벡터를 csv 문자열로 반환하는 것입니다. 동일한 차이점이 있지만 순서가 지정된 벡터의 임시 테이블이 더 빠를 것입니다. 일반적으로, SQL 언어는 이런 종류의 세트 로직을 잘 못합니다 (내가보고 있지 않은 동안 진화하지 않았다는 가정하에). – sgtz

+0

피봇이 도움이되지 않습니다. 그러면 함수를 통해 정렬 된 벡터가 남습니다. 그렇지 않으면 제한된 직교 좌표계 (yuck)에 distinct를 도입하고 위의 쿼리에서 계산 된 개수와 일치하는지 확인해야합니다. – sgtz

0

OK CSV로, 다음이 당신에게 아이디어를 제공 할 수 있습니다. 내 머리 꼭대기에서 벗어나므로 구문을 검사하지 않습니다. 또한 bigint는 일반적으로 2 ** 63 또는 그 이상으로 증가하기 때문에 제한적입니다. 먼저 bnumber 1,2,4,8 등으로 1,2,3,4 등

update #child set bnumber = 2**(id-1) 

세트 것 #child

create table #child (accessory varchar, price decimal, id identity, 
bnumber bigint null) 
insert into #child(accessory, price) 
select accesory,price from childtable group by accessory price 

가정 ID로 고유의 자식 액세서리 가격을 넣어 (이 bigint 제한이 시작될 수있는 곳입니다).그래서 지금 당신은

mouse, 10,1,1 
keyboard,10,2,2 
speakers,50,3,4 

지금 당신은 내가 당신이 원하는 답이라고 생각 요식

1, 3 
2, 4 
3, 3 
4, 3 

주는 부모

select p.item, sum(ctemp.bnumber) 
from parent p, child c, #child ctemp 
where p.parentid = c.parentid 
and c.accessory = ctemp.accessory 
and c.price  = ctemp.price 
group by p.item 

이러한 숫자를 요약 할 수있다. 이것은 조금 어수선하며 긴 하루였습니다 (!), 그러나 도움이 될 것입니다.

관련 문제