SQL Server 2008加入,联盟,多个选择?

时间:2016-06-17 12:53:56

标签: sql sql-server sql-server-2008 join

真的很难在SQL Server 2008中创建这个视图。多个连接我没有问题,但我不太确定这次获取我需要的数据的最佳方法。

我有一个表,#34;版本",其中的列包含JobNumber,版本号,DateCreated,CreatedBy,状态和描述。

我希望在结果中返回所有这些列。

然后它变得更加棘手。

我有另一张名为" Equipment"的表。在该表中,我有3列,我想与"版本"交叉引用。表。这些列是ModifiedVersion,ModifiedDate和ModifiedBy。我需要做的是找到修改行的最后日期,并将其返回到与上一个表中的版本号相同的行中。

所以最终结果将是:



<table border="1">
  <tr>
    <td>Job Number</td>
    <td>Version</td>
    <td>Date Created</td>
    <td>Created By</td>
    <td>Last Modified</td>
    <td>Last Modified By</td>
  </tr>
  <tr>
    <td>123</td>
    <td>1.00</td>
    <td>01-01-2016</td>
    <td>User 12</td>
    <td>31-01-2016</td>
    <td>User 16</td>
  </tr>
    <tr>
    <td>123</td>
    <td>2.00</td>
    <td>21-03-2016</td>
    <td>User 8</td>
    <td>15-06-2016</td>
    <td>User 11</td>
  </tr>
<tr>
    <td>456</td>
    <td>1.00</td>
    <td>01-01-2016</td>
    <td>User 12</td>
    <td>31-01-2016</td>
    <td>User 16</td>
  </tr>
    <tr>
    <td>456</td>
    <td>2.00</td>
    <td>21-03-2016</td>
    <td>User 8</td>
    <td>15-06-2016</td>
    <td>User 11</td>
  </tr>
   <tr>
    <td>456</td>
    <td>3.00</td>
    <td>01-04-2016</td>
    <td>User 8</td>
    <td>NULL</td>
    <td>NULL</td>
  </tr>
  </table>
&#13;
&#13;
&#13;

所以问题是如何选择上次修改日期(使用&#34; MAX&#34;我知道)很容易,但是与版本表中的版本号交叉引用。

版本和设备表都有一个&#34; JobNumber&#34;需要在它们之间进行连接的列。

最后,我将在CreatedBy和ModifiedBy列上进行连接,以获得用户表中保存的用户的实际名称。

我已经使用派生表和各种连接,我可以非常接近,但是当不同的用户进行了修改并且没有进行任何修改时会遇到问题。如果没有进行任何修改,我希望NULL值在结果中。它是ModifiedBy列的分组,它似乎出错了。

我能得到的最接近的是:

SELECT     
    dbo.t_ProjectEquipmentVersions.ID, 
    dbo.t_ProjectEquipmentVersions.JobNumber, 
    dbo.t_ProjectEquipmentVersions.VersionNumber, 
    dbo.t_ProjectEquipmentVersions.DateCreated, 
    dbo.t_ProjectEquipmentVersions.CreatedBy,     
    dbo.t_ProjectEquipment.ModifiedVersion, 
    MAX(dbo.t_ProjectEquipment.ModifiedDate) AS LastModifiedDate, 
    dbo.t_ProjectEquipment.ModifiedBy
FROM         
    dbo.t_ProjectEquipmentVersions 
LEFT OUTER JOIN
    dbo.t_ProjectEquipment ON dbo.t_ProjectEquipmentVersions.VersionNumber = dbo.t_ProjectEquipment.ModifiedVersion
GROUP BY 
    dbo.t_ProjectEquipmentVersions.ID, 
    dbo.t_ProjectEquipmentVersions.JobNumber, 
    dbo.t_ProjectEquipmentVersions.VersionNumber, 
    dbo.t_ProjectEquipmentVersions.DateCreated, 
    dbo.t_ProjectEquipmentVersions.CreatedBy, 
    dbo.t_ProjectEquipment.ModifiedVersion, 
    dbo.t_ProjectEquipment.ModifiedBy

这很接近,但我得到3个结果行,而不是我想得到的2个。这似乎是因为modifiedBy列具有不同的用户ID。如果我删除&#34; ModifiedBy&#34;从完全选择我得到我追求的结果。

任何建议,提示,帮助都会非常感激。

2 个答案:

答案 0 :(得分:0)

使用外部申请

SELECT     
    pev.ID, 
    pev.JobNumber, 
    pev.VersionNumber, 
    pev.DateCreated, 
    pev.CreatedBy,     
    pe.LastModifiedDate,
    pe.ModifiedBy
FROM         
    dbo.t_ProjectEquipmentVersions  pev
OUTER APPLY (
    SELECT TOP(1) pe.ModifiedDate AS LastModifiedDate
        ,pe.ModifiedBy 
    FROM dbo.t_ProjectEquipment pe
    WHERE pe.ModifiedVersion = pev.VersionNumber 
    ORDER BY ModifiedBy DESC
) pe 

答案 1 :(得分:0)

SELECT     
    dbo.t_ProjectEquipmentVersions.ID, 
    dbo.t_ProjectEquipmentVersions.JobNumber, 
    dbo.t_ProjectEquipmentVersions.VersionNumber, 
    dbo.t_ProjectEquipmentVersions.DateCreated, 
    dbo.t_ProjectEquipmentVersions.CreatedBy,     
    dbo.t_ProjectEquipment.ModifiedVersion, 
    dbo.t_ProjectEquipment.ModifiedDate,
    dbo.t_ProjectEquipment.ModifiedBy
FROM   dbo.t_ProjectEquipmentVersions 
LEFT OUTER JOIN (
                SELECT  E1.ModifiedVersion, E2.ModifiedDate, E1.ModifiedBy
                FROM     t_ProjectEquipment E1
                INNER JOIN 
                    (SELECT ModifiedVersion, MAX(ModifiedDate) AS ModifiedDate
                    FROM    dbo.t_ProjectEquipment 
                    GROUP BY ModifiedVersion, ModifiedBy
                    ) E2
                ON E1.ModifiedVersion = E2.ModifiedVersion
                )   t_ProjectEquipment

    ON dbo.t_ProjectEquipmentVersions.VersionNumber = t_ProjectEquipment.ModifiedVersion

在必要时在连接中使用JobId。