2012-02-09 4 views
0

다음은 테이블 구조이며 처음 6 개 열은 복합 키입니다.SQL 복합 키가있는 모든 레코드 선택

col1 col2 col3 col4 col5 col6 col7 col8 
A1 A2 A3 A4 A5 1 xx yy 
A1 A2 A3 A4 A5 2 xxx yyy 
A1 A2 A3 A4 A5 3 a b 
A1 B2 A3 A4 A5 4 aa bb 
B1 A2 A3 A4 A5 5 aaa bbb 
B1 B2 B3 B4 B5 6 d e 
B1 B2 B3 B4 B5 7 dd ee 
B1 B3 C3 B4 B5 8 ddd eee 

나는 모든 포인터 또는 도움이 감사

A1 A2 A3 A4 A5 xx yy xxx yyy a b 
A1 B2 A3 A4 A5 aa bb 
B1 A2 A3 A4 A5 aaa bbb  
B1 B2 B3 B4 B5 d e dd ee 
B1 B2 C3 B4 B5 ddd eee 


아래처럼 값을 반환하는 저장 프로 시저가 필요합니다.

+0

결과에서 처음 5 개의 값은 충분히 간단합니다. 그러나 각 행에 대해 서로 다른 개수의 열이 있습니다. SQL은이를 지원하지 않습니다. "xx, yy, xxx, yyy, a, b"(예 :)를 단일 문자열로 반환 하시겠습니까? 그렇다면 왜? 이와 같은 비정규 화는 접근법에서 문제가있는 것처럼 느껴지며, 달성하고자하는 것을 알고 있다면 다른 접근법을 제시 할 수 있습니다. – MatBailie

+0

답장을 보내 주셔서 감사합니다. 처음 다섯 개의 열이 행에 대해 동일한 경우, 나는 행이 처음 5 개의 열에 대해 중복 된 행에 따라 동적으로 변경되는 table.yes의 단일 행에 값을 표시합니다. sql queries.i는 가능한지 여부를 확신하지 못합니다. – vijay

+1

짧은 대답은 "아니오, 동적 열 수를 가질 수 없습니다"입니다. 이 결과가 * 필요한 * 것을 설명하면 대안을 제시 할 수 있습니다. – MatBailie

답변

0

그냥 이런 결과가 필요한 경우 :

A1 A2 A3 A4 A5 xx,yy,xxx,yyy,a,b 
A1 B2 A3 A4 A5 aa,bb 
B1 A2 A3 A4 A5 aaa,bbb 
B1 B2 B3 B4 B5 d,e,dd,ee 
B1 B3 C3 B4 B5 ddd,eee 

그런 다음 간단한 쿼리 할 것 :

select COL1 
     ,COL2 
     ,COL3 
     ,COL4 
     ,COL5 
     ,LISTAGG(COL7 || ',' || COL8, ',') within group (order by COL6) 
    from TAB1 
group by COL1, COL2, COL3, COL4, COL5 
order by COL1, COL2, COL3, COL4, COL5 

은 동적 SQL을 작성해야합니다 컬럼의 동적 번호를합니다. 이에 대한 안내는 this 문서를 참조하십시오.

+0

나는 2005 년 SQL 서버에서 일하고있다. 나는리스 타지를 얻지 못하고있다. – vijay

+0

내 대답은 오라클을위한 것이었다. SQL Server를 나타 내기 위해 질문의 태그를 업데이트합니다. [this] (http : //www.simple-talk.SQL Server의 행을 연결하는 방법에 대한 com/sql/t-sql-programming/concatenating-row-values-in-transact-sql /) 문서를 참조하십시오. –

0

첫 번째로 쿼리의 표준 결과 집합으로 가변 개수의 열을 반환 할 수는 있지만 xml 열 (SQL 2005에 구현 됨) http://msdn.microsoft.com/en-us/library/ms345117%28v=sql.90%29.aspx 인 열을 반환 할 수 있으며이 열을 바인딩 할 수 있습니다. 바인딩은 동적이어야합니다. 피벗 함수 http://msdn.microsoft.com/en-us/library/ms177410.aspx을 사용하여 원하는 형식으로 데이터를 표시 할 수 있습니다. 또는 위에서 설명한 것처럼 동적 SQL을 사용할 수 있습니다. 이렇게하면 저장 프로 시저 내에서 동적 SQL을 생성하고 sp_executesql을 사용하여 생성하는 문자열을 실행합니다. http://msdn.microsoft.com/en-us/library/ms175170.aspx 주입 공격으로부터 보호하려면 http://support.microsoft.com/kb/262499 매개 변수를 전달해야 할 수 있습니다. 배울 수있는 몇 가지 단계 ... 그러나 각 단계는 특히 어렵지 않고 훌륭한 운동입니다!

+0

예를 들어 도움이 될 것입니다 ... – vijay

+0

잘 링크의 예제 스크립트를 가지고, 내가 그것을 할 방법은 기본 선택으로 시작하고, 작품을 증명하고, 그 선택과 sp_executesql을 생성하는 스크립트를 만듭니다. 그런 다음 단계별로 단계별로 생성 스크립트를 수정하고 각 버전을 저장하면 완전히 엉망이되었을 때 돌아갈 수 있습니다. 배우는 것은 매우 힘든 기술이며, 실제로 배울 수있는 유일한 방법은 다이빙과 시도입니다. –

0

이것을 확인하십시오. 도움이되는지 아닌지를 확인하십시오. SQL Server 2008을 사용하여 요구 사항에 따라 결과를 반환합니다.

SELECT col1, col2, col3, col4, col5, 
(SELECT ' ' + col7 + ' ' + col8 FROM TABLE1 t1 
WHERE t1.col1 = t.col1 and t1.col2 = t.col2 and 
t1.col3 = t.col3 and t1.col4 = t.col4 and t1.col5 = t.col5 
ORDER BY col6 
FOR XML PATH('')) AS mearge_col 
FROM TABLE1 t 
GROUP BY col1, col2, col3, col4, col5 
관련 문제