2013-07-08 4 views
1

면책 조항 :이 질문의 제목을 올바르게 지정하는 방법을 모르므로 이미 질문을 받으면 사과드립니다. 비슷한 제목과 내용으로 찾은 질문은 내 문제를 해결하지 못했습니다.단일 테이블의 여러 행이있는 SQL 조인

두 개의 표, 문제점 및 텍스트가 있습니다. 이슈와 텍스트는 모두 이슈의 기본 키 역할을하는 ID 열을 공유합니다. 텍스트는 ID와 필드를 키 열로 사용합니다.

궁극적으로 나는 원하는 문제의 내용을 선택하는 SQL 쿼리를 원합니다. ID를 기반으로 올바른 값을 선택합니다. 조인을 사용하고 있지만 여러 행이 필요할 때 작동하도록 알지 못합니다. 일치하는 ID와 A의 Text.Field 값, 일치하는 ID의 B 열 및 B의 Text.Field 값에 대해 열 A를 출력하고 싶습니다.

어떻게해야합니까? ? 나는 네티 환경에서 당기는거야

, 피벗

감사

사용할 수 없습니다 있도록

예 구조 :

Issues Table: 
|ID|Column1|Column2| 
-------------------- 
|0 |  17|  18| 
|1 |  19|  20| 

Text Table: 
|ID| Field| Value | 
-------------------- 
|0 |  A|  30| 
|0 |  B|  31| 
|1 |  A|  40| 
|2 |  B|  41| 

Output: 
|ID|Column1|Column2|Column3 (Field = 'A') | Column4 (Field = 'B')| 
------------------------------------------------------------------ 
| 0|  17|  18|     30 |     31 | 
| 1|  19|  20|     40 |     41 | 
+0

테이블 문제와 텍스트 사이에 1 대 다수의 관계가 있습니까? – STLDeveloper

+0

당신은 문제의 1 행이 텍스트의 여러 행에 해당한다는 것을 의미합니까? 예. 이슈에는 ID가 기본 키로 있습니다. 텍스트는 ID와 필드를 사용합니다. –

+0

당신이 찾고있는 키워드는'pivot'입니다 - http://stackoverflow.com/questions/tagged/pivot+sql을보십시오 –

답변

3
SELECT 
    Issues.ID, 
    Issues.Column1, 
    Issues.Column2, 
    Text.Value Column3, 
    Text2.Value Column4 
FROM 
    Issues LEFT OUTER JOIN Text ON Text.ID = Issues.ID AND Text.Field = 'A' 
    LEFT OUTER JOIN Text AS Text2 ON Text2.ID = Issues.ID AND Text2.Field = 'B' 
+0

지금은 테이블 구조에 대한 시각적 설명을 입력하고 있지만 설명의 두 번째 단락을 보면 작동하지 않는 것을 볼 수 있습니다. 텍스트에는 두 개의 기본 키가 필요합니다. 필드 키의 값을 기반으로 출력에 다른 열을 갖고 싶습니다. –

+0

위의 전체 설명을 게시했습니다. 방금 표 예제를 추가했습니다. –

+0

다른 의견을 보지 못했다면 Pivot을 사용할 수 없습니다. –

2

또한으로 집계 함수를 사용할 수 있습니다 결과를 얻기위한 CASE 표현식 :

select i.id, 
    i.column1, 
    i.column2, 
    max(case when t.field='A' then t.value end) Column3, 
    max(case when t.field='B' then t.value end) Column4 
from issues i 
left join text t 
    on i.id = t.id 
group by i.id, i.column1, i.column2; 

가끔

확인 필드/ID 필드의 모든 인덱스가 있는지 확인 다른 경우 (UGG) 필요하지만, 필요한 약간의 낭비와 아닌 개인적으로 조인 왼쪽 말할 것 SQL Fiddle with Demo

1

참조,이 매우 빠를 것입니다

SELECT 
    Issues.ID, 
    Issues.Column1, 
    Issues.Column2, 
    TextA.Value as Column3, 
    TextB.Value as Column4 
FROM 
    Issues 
    Text as TextA 
    Text as TextB 
WHERE 
    TextA.ID = Issues.ID 
    AND TextA.Field = 'A' 
    AND TextB.ID = Issues.ID 
    AND TextB.Field = 'B' 
관련 문제