带有JOINS的SQL SELECT和一列的多行

时间:2014-06-17 15:21:54

标签: sql sql-server

手头的问题是我有一个基本的查询(来自文档软件数据库),从多个表中获取一些LEFT JOINS,但我有一个问题需要从有多个结果的表中获取每个唯一文档ID(DocGUID)。

当前查询

SELECT  doc.[Doc #]
        , '' AS 'Authors'
        , ud.[Lead Author]
        , doc.[Title]
        , ud.[Publication]
        , ud.[Citation]
        , ud.[Year]
        , ud.[Month]
        , ud.[Comments]
        , notes.[Note]
FROM    [tblDocuments] doc
LEFT JOIN [tblNotes] notes ON notes.[DocGUID] = doc.[DocGUID]
LEFT JOIN [tblUserData] ud ON ud.[MasterGUID] = doc.[DocGUID]
WHERE doc.[DocGUID] = '12345678'

正如您所看到的,我只是简单地询问过''为"作者"。这是我的问题所在。我有一个名为tblMultiValues的表,其中每个DocGUID列出两个或更多作者。

表示例:(对于tblMultiValues)

|------|-------------|-------------|-------------------|
|  Id  |   DocGUID   |  FieldName  |       Value       |
|------|-------------|-------------|-------------------|
| 123  |   12345678  |   Authors   |   Collins, Nick   |
| 456  |   12345678  |   Authors   |  Williams, Robert |
| 321  |   87654321  |   Authors   |    Smith, Kate    |
| 654  |   87654321  |   Authors   |    Hanks, Tom     |
|------|-------------|-------------|-------------------|

所以,我想要为##;作者'的第二列显示的是:

Collins, Nick; Williams, Robert

专门针对' 12345678'

的DocGUID

如何实现这一点,与已经构建的查询混合在一起?

(我希望这是足够的信息......如果需要更多信息,请告知)。

-Nick

::: EDIT :::

我能够使用以下代码运行...(从@ mohan111给出的答案中得到很好的指导

SELECT  DISTINCT
    STUFF((
        SELECT  '; ' + mv2.Value
        FROM    [dbo].[tblMultiValues] mv2
        WHERE   mv1.DocGUID = mv2.DocGUID
        FOR XML PATH ('')),1,2,'') AS 'Authors', mv1.FieldName, mv1.DocGUID
INTO    #TempMultival
FROM    [dbo].[tblMultiValues] mv1

SELECT  doc.[Doc #]
        , tmv.[Authors]
        , ud.[Lead Author]
        , doc.[Title]
        , ud.[Publication]
        , ud.[Citation]
        , ud.[Year]
        , ud.[Month]
        , ud.[Comments]
        , notes.[Note]
FROM    [tblDocuments] doc
LEFT JOIN [tblNotes] notes ON notes.[DocGUID] = doc.[DocGUID]
LEFT JOIN [tblUserData] ud ON ud.[MasterGUID] = doc.[DocGUID]
LEFT JOIN #TempMultiVal tmv ON tmv.DoCGUID = doc.[DocGUID]

DROP TABLE #TempMultiVal 

1 个答案:

答案 0 :(得分:2)

Declare @table TABLE 
(
    Id INT, 
    DocGUID    int,
    FieldName VARCHAR(25),
    Value VARCHAR(200)
);

INSERT INTO @table
(   Id, 
    DocGUID,
    FieldName,
    Value

)
VALUES
    (123,12345678,'Authors','Collins, Nick'),
    (456,12345678,'Authors','Williams, Robert'),
    (321,87654321,'Authors','Smith, Kate'),
    (654,87654321,'Authors','Hanks, Tom');
    Select distinct DocGUID,
    (SELECT 
    Substring((SELECT ', ' + CAST(i.id AS VARCHAR(1024)) 
    FROM   
    @table i 
    WHERE  i.DocGUID = tt.DocGUID 
    ORDER  BY i.id 
    FOR XML PATH('')), 3, 10000000) AS list) AS ID,
    FieldName,
    STUFF((Select distinct t.Value +  ',' 
        from @table t 
    where t.DocGUID = tt.DocGUID 
    FOR XML PATH(''),TYPE).value('.', 'NVARCHAR(MAX)') 
                        , 1,  0, ' ') from @table tt