2015-06-12 32 views
2

如果重複,則很抱歉。請指出我的正確問題。我正在使用SQL SERVER 2008.我使用下面的查詢,因爲我需要從3個表中獲取數據。SQL:將一行分爲兩行,具體取決於列

SELECT qc.FileID as [FileID],  
qc.QID1 as [QID1],  
xqs.SID1 as [SID1], 
xqc.CID1 as [CID1], 
xqs.Comments as [SComments], 
xqc.Comments as [CComments] 
FROM QCTable(nolock) qc 
JOIN QCSectionTable (nolock) xqs ON qc.QCID = xqs.QCID 
LEFT JOIN QCChargeTable (nolock) xqc ON xqc.QCXrefID = xqs.QCXrefID 

對於上面我得到這個像 FieID1 SID1 SID1 CID1 SComments CComments

我有一排像下面

FileID1 QID1 SID1 CID1 SComments CComments 

我需要上面一行拆分爲

FileID1 QID1 SID1 null SComments 
FileID1 QID1 SID1 CID1 CComments 

在此先感謝。

+0

我看來像你也許可以使用(https://technet.microsoft.com/en-us [unpivot的。] /library/ms177410(v=sql.105).aspx)下面是一個[示例](http://stackoverflow.com/questions/19055902/unpivot-with-column-name) – xQbert

+0

有點偏離主題,但爲什麼nolocks?你知道所有的「好處」......特定查詢提示的錯誤嗎? http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/ –

+0

@ Sean:我在我真正的查詢中使用nolock。這只是示例查詢。 – Ziggler

回答

1

你可以使用UNION ALL做這樣的事情:

SELECT 
    qc.FileID AS [FileID1] 
    ,qc.QID1 AS [QID1] 
    ,xqs.SID1 AS [SID1] 
    ,NULL AS [CID1] --assigning default value as null 
    ,xqs.Comments AS [SComments] 
FROM QCTable(NOLOCK) qc 
JOIN QCSectionTable(NOLOCK) xqs ON qc.QCID = xqs.QCID 
LEFT JOIN QCChargeTable(NOLOCK) xqc ON xqc.QCXrefID = xqs.QCXrefID 

UNION ALL 

SELECT 
    qc.FileID AS [FileID1] 
    ,qc.QID1 AS [QID1] 
    ,xqs.SID1 AS [SID1] 
    ,xqc.CID1 AS [CID1] 
    ,xqc.Comments AS [CComments] 
FROM QCTable(NOLOCK) qc 
JOIN QCSectionTable(NOLOCK) xqs ON qc.QCID = xqs.QCID 
LEFT JOIN QCChargeTable(NOLOCK) xqc ON xqc.QCXrefID = xqs.QCXrefID 
+0

我做了你所說的,但在我的第二個選擇查詢中,我使用了INNER JOIN而不是LEFT JOIN。我將此標記爲答案。 – Ziggler

+0

太棒了!很高興它爲你工作! :) – FutbolFan

2

最簡單的方法是union all

select FileID1, QID1, SID1, null as cId1, SComments 
from table t 
union all 
select FileID1, QID1, SID1, cId1, CComments 
from table t; 

如果你有大量的數據,它可以是一個有點快這一點使用cross apply做或cross join

select v.* 
from table t cross apply 
    (values (FileID1, QID1, SID1, null, SComments), 
      (FileID1, QID1, SID1, cId1, CComments) 
    ) v(FileID1, QID1, SID1, cId1, CComments); 

優勢這是否會只掃描一次表格。

+0

我更新了我的問題和更多關於我的要求的信息。謝謝 – Ziggler

+0

謝謝我使用UNION ALL – Ziggler

+0

@Ziggler。 。 。考慮到你的表已經變成了查詢,我認爲你可以通過'cross apply'獲得更好的性能。 –

1
SELECT FileID1, QID1, DID1, null, SComments 
FROM table 
UNION ALL 
SELECT FileID1, QID1, SID1, CID1, CComments 
FROM table 
+0

我更新了我的問題和更多關於我的要求的信息。謝謝 – Ziggler

+0

謝謝我使用了UNION ALL。 – Ziggler

相關問題