SQL请参考加入两个表,组和顺序

时间:2014-12-11 19:20:27

标签: sql sql-server entity-framework

我有两个表需要咨询一个查询,我有Participante表来存储来自用户的一些数据和ParticipanteResultado来存储该用户的答案。< / p>

Participante

participanteID,
tipo,
**other fields**

EF使用来自tipo的{​​{1}}字段,因此我可以从查询中接收数据

Participante

ParticipanteResultado

我的participanteResultadoID, participanteID, tipo, quantidadeValidas 表每个用户可以有大约10个结果,ParticipanteResultado上的结果可能不同(A,B,C,D ......)。

tipo

我需要的是显示用户数据和他的最佳结果。通过最好的结果,我的意思是在participanteResultadoID participanteID tipo quantidadeValidas 4 88 S 5 5 88 E 5 字段上具有最高值的结果。我已经设法用以下查询来做到这一点:

quantidadeValidas

我的问题是,在我给出SELECT participanteID, nome, email, unidadeCE, telefone, (SELECT TOP(1) tipo FROM ParticipanteResultado pr WHERE p.participanteID = pr.participanteID ORDER BY quantidadeValidas DESC) AS tipo FROM Participante p 数据的示例中,我让用户ParticipanteResultado有一个平局,我需要带上这两个值,它们可以在同一列中像( S,E)。

更新

这是我的查询结果:

88

P.S。我在c#Entity Framework上使用此查询与我的数据库上下文

3 个答案:

答案 0 :(得分:1)

根据集合来考虑数据。

您需要一组包含所有参与者及其所有分数的数据 和一组参与者的最大量化值Validas

首先获取每个参与者的最大quantdadeValidas列表

SELECT MAX(PR.quantidadeValidas), PR.participanteID
FROM ParticipanteResultado PR
GROUP BY participanteID

现在获得参与者和分数。

SELECT participanteID, nome, email, unidadeCE, telefone,
FROM Participante p
INNER JOIN ParticipanteResultado PR
 on p.participanteID = pr.participanteID

现在我们有两组数据需要将所有分数限制为仅最大值,因此将两个组合并在一起。对每个上述查询使用公用表表达式,然后连接应该为您提供保持关系的所需结果。

with maxScores as (
    SELECT MAX(PR.quantidadeValidas) maxScore, PR.participanteID
    FROM ParticipanteResultado PR
    GROUP BY participanteID
    ), 
    CompleteSet as (
    SELECT participanteID, nome, email, unidadeCE, telefone, PR.tipo PR.quantidadeValidas
    FROM Participante p
    INNER JOIN ParticipanteResultado PR
      on p.participanteID = pr.participanteID)
   SELECT CS.participanteID, nome, email, unidadeCE, telefone, tipo
   FROM maxScores MS
   INNER JOIN CompleteSet CS
    on MS.MaxScore = CS.QuantidadeValidas
   and CS.ParticipanteID = MS.ParticipanteID

或者没有CTE(通用表格表达式)......(但在我看来更难阅读)

   SELECT CS.participanteID, nome, email, unidadeCE, telefone, tipo 
   FROM (
      SELECT MAX(PR.quantidadeValidas) maxScore, PR.participanteID
      FROM ParticipanteResultado PR
      GROUP BY participanteID) MS
   INNER JOIN (
      SELECT participanteID, nome, email, unidadeCE, telefone, PR.tipo PR.quantidadeValidas
        FROM Participante p
        INNER JOIN ParticipanteResultado PR
          on p.participanteID = pr.participanteID) CS
    on MS.MaxScore = CS.QuantidadeValidas
   and CS.ParticipanteID = MS.ParticipanteID

现在如果你只想在一个平局时只需要一行,你就必须使用Stuff,或者使用forXMLpath将多行合并为一个......但是因为你预期的结果并没有。为了展示你如何设想工作关系,我选择了多排概念。而不是将值组合到Tipo列。

答案 1 :(得分:1)

由于您只需要每个参与者的最高结果,我会使用排名功能:

WITH    cte
          AS ( SELECT   participanteID ,
                        nome ,
                        email ,
                        unidadeCE ,
                        telefone ,
                        tipo ,
                        RANK() OVER ( PARTITION BY participanteID ORDER BY tipo DESC ) AS rnk
               FROM     ParticipanteResultado
             )
    SELECT DISTINCT
            participanteID ,
            nome ,
            email ,
            unidadeCE ,
            telefone ,
            SUBSTRING(( SELECT  ',' + t1.tipo AS [text()]
                        FROM    cte t1
                        WHERE   t1.participanteID = t2.participanteID
                                AND t1.rnk = 1
                        ORDER BY t1.participanteID
                      FOR
                        XML PATH('')
                      ), 2, 1000) [tipos]
    FROM    ParticipanteResultado t2
    WHERE   t2.rnk = 1

答案 2 :(得分:0)

查看CTE或xml路径。这些值需要合并到一个字段中,但需要另外一个子查询来执行此操作。

SELECT participanteID, nome, email, unidadeCE, telefone, 
tipos=
    SUBSTRING((
        SELECT  ', ' + CAST(tipo AS NVARCHAR(10))
        FROM 
        (
            SELECT DISTINCT tipo FROM ParticipanteResultado WHERE participanteID=X2.UserID
        )AS X2                      
        ORDER BY tipo FOR XML PATH( '' )
    ), 3, 1000 )
FROM Participante p