2013-07-08 102 views
1

聲明:我不知道如何正確地標題這個問題,所以我很抱歉,如果它已被問。我用類似的標題和內容找到的問題沒有解決我的問題。SQL與單個表的多行加入

我有兩個表,問題和文本。問題和文本都共享一個用作問題主鍵的ID列。文本使用ID和字段作爲鍵列。

最終我想要一個sql查詢來選擇我想要的問題中的內容,然後根據ID從文本中選擇正確的值。我一直在使用連接,但當我想要多行時,我不知道該如何工作。我希望在匹配的ID的輸出中有A列,A的Text.Field值爲B,匹配ID爲B列,Text.Field值爲B.

我該如何去完成此操作?

我從Netezza公司環境拉動,所以Pivot是不可

感謝

示例結構:

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

現在我正在打印表格結構的可視化描述,但是如果您看到描述的第二段,則可以看到這不起作用。文本需要兩個主鍵。我想根據Field鍵的值在輸出中有不同的列。 –

+0

我已經發布了上面的完整描述。我只是添加了表格示例。 –

+0

另外,如果您還沒有看到其他評論,則Pivot不可用。我正在使用Netezza –

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; 

SQL Fiddle with Demo

1

個人而言,我會說離開聯接是有點浪費,而不是必需的,但在其他情況下(雪地)偶爾需要

確保現場/ ID領域均具有索引,這將超快速

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'