2011-11-23 2 views
2

함수에서 사용할 수있는 쿼리가 필요하며 n 값의 모든 순열을 검색합니다. 그리고 k = 1..n 인 모든 길이의 k의 순열이 필요합니다.k 값 (k = 1 ... n)의 모든 순열 얻기

EDIT # 1 : 확장 된 샘플 입력 및 결과로 입력에 2 대신 3 개의 값이 있음 - 그러나 입력 값의 수는 1에서 n까지 다양 할 수 있습니다.

예 :

입력 : 복수의 열

한 열의 값 테이블
Value (nvarchar(500)) 
    ------ 
    Ann 
    John 
    Mark 

편집 # 2 : I는 다음과 같은 출력

중 살 수

출력 # 1 : 테이블 하나의 열에 연결된 값

Ann 
    John 
    Ann,John 
    John,Ann 
    Ann,Mark 
    Mark,Ann 
    John,Mark 
    Mark,John 
    Ann,John,Mark 
    Ann,Mark,John 
    John,Ann,Mark 
    John,Mark,Ann 
    Mark,Ann,John 
    Mark,John,Ann 

출력 # 2 : permutat의 ID를 가진 테이블 이온/조합 값 순서

id value order 
    -------------------- 
    1  Ann  1 
    2  John  1 
    3  Ann  1 
    3  John  2 
    4  John  1 
    5  Ann  2 

주 :

  • 이 SQL 서버에서 작동해야 2008 R2
  • 함수 내에서 작동해야 입력에 초과해서는 안 것으로 구별 요소
  • 최대 개수 5 - 성능 또는 기타 이유로 문제가되는 경우
  • 입력 테이블의 값 열은 200자를 초과 할 가능성이 없습니다. 성능 또는 기타 이유로 중요 할 경우 내가 Generating Permutations in T-SQL 포럼 스레드를 발견했습니다하지만 K = 1을 할 것으로 기대 출력 포맷뿐만 아니라, 힘을주고 그것을 수정하지 못했다 인터넷을 통해 검색을 많이 후 THER 이유

... n 순열도.

대부분 SQL 이외의 언어로 작성된 유사한 문제에 대한 솔루션이 많이 있지만이 특정 문제를 해결하는 데 도움이되는 해결책을 찾을 수 없습니다.

+0

당신은 무엇을 시도? 아마도 선택된 필드가 서로 같지 않은 제약 조건을 가진 n- 웨이 자체 조인입니까? –

+0

@RaymondHettinger : 질문에 지정된 링크에서 코드를 수정하려고했습니다. 또한 다양한 다른 솔루션을 수정하려고 시도했지만 많은 기사의 저자가 순열과 결합을 오해했습니다. 그리고 이것은 둘 다 혼합되어 있습니다. 다중 조인과 같은 N- 조인? 아니요, 제가 값의 수를 알지 못하기 때문에 작동하지 않습니다 (질문 k = 1 ... n에서 언급 한 바와 같이). –

+0

그때 힘들 수 있습니다. 변수 길이의 필드를 반환하는 매개 변수가있는 SQL 쿼리에 대해서는 알지 못합니다. –

답변

8
;WITH Names(Name) As 
(
SELECT 'Ann' UNION ALL 
SELECT 'John' UNION ALL 
SELECT 'Mark' 
), R(Name,Lvl) AS 
(
SELECT CAST(',' + Name AS VARCHAR(MAX)), 1 
FROM Names 
UNION ALL 
SELECT R.Name + ',' + N.Name, Lvl + 1 
FROM R JOIN Names N ON R.Name + ',' NOT LIKE '%,' + N.Name + ',%' 
) 
SELECT STUFF(Name,1,1,'') AS Name 
FROM R 
ORDER BY Lvl, Name 

반환

Name 
------------------------------ 
Ann 
John 
Mark 
Ann,John 
Ann,Mark 
John,Ann 
John,Mark 
Mark,Ann 
Mark,John 
Ann,John,Mark 
Ann,Mark,John 
John,Ann,Mark 
John,Mark,Ann 
Mark,Ann,John 
Mark,John,Ann 
+0

마틴, 이것은 완벽한 해결책입니다, 고마워요! 내가 T-SQL 코드를 너무 복잡하게 만든 것 같습니다. –

+0

@ FilipPopović 나는 당신의 실제 데이터가'LIKE' 연산자에 특별한 의미의 쉼표 나 문자를 포함하지 않는다고 가정했습니다. 그렇지 않은 경우 조정이 필요할 수 있습니다. –

+0

Martin, data는 일부 테이블의 열 이름입니다. 내 경우에는 밑줄이있는 열이 있습니다. 빠른 테스트를 수행하고 특정 테스트 케이스에 대해서는 작동하지만 쿼리를 조정할 수 있다면 정말 고맙겠습니다. 미리 감사드립니다. –