SQL查询SELECT中的多个列 - 一个需要是DISTINCT

时间:2017-09-19 18:40:43

标签: sql sql-server

这是我的SQL代码:

SELECT 
    T.Template_Id, T.TemplateName,
    CONVERT(NVARCHAR(MAX), T.CatalogDescription),
    T.MasterNo, T.Customer_Id,
    O.Quantity, O.Cost 
FROM 
    Template as T 
INNER JOIN 
    [Order] AS O ON T.Template_Id = O.Template_Id 
ORDER BY 
    O.Cost

我的问题是,我选择的字段都不是唯一的,我希望T.Template_IdDISTINCT,我无法找到办法。其他专栏并不重要,只要他们在那里并且T.Template_Id列是DISTINCT(没有重复)。

3 个答案:

答案 0 :(得分:1)

  

其他领域并不重要。

如果这是真的 * ,你可以这样做:

SELECT T.Template_Id, MAX(T.TemplateName) As TemplateName,
    CONVERT(NVARCHAR(MAX),MAX(T.CatalogDescription)) As CatalogDescription,
    MAX(T.MasterNo) As MasterNo, MAX(T.Customer_Id) As CustomerId,
    MAX(O.Quantity) As Quantity, MAX(O.Cost) As Cost
FROM Template as T 
INNER JOIN [Order] as O ON T.Template_Id=O.Template_Id 
GROUP BY T.Template_Id
ORDER BY MAX(O.Cost)

只要您使用相同<的字段,查看哪些对应的Order字段并不重要的问题就不那么常见了。 / em>订单记录。在这种情况下,您可以这样做:

SELECT T.Template_Id, T.TemplateName, 
     CONVERT(NVARCHAR(MAX),T.CatalogDescription), 
     T.MasterNo, T.Customer_Id, O.Quantity, O.Cost
FROM Template as T 
CROSS APPLY (SELECT TOP 1 * FROM [Order] WHERE T.Template_Id=[Order].Template_Id) As O
ORDER BY O.Cost

当然,假设至少在Template表中的记录已根据ID唯一。这样做的好处还在于,只需在嵌套查询中添加ORDER BY子句,就可以更轻松地选择选择顺序。

* 提示:事实证明这种情况很少发生。你几乎总是会发现它在某些方面确实很重要,因为至少有一个领域。

答案 1 :(得分:1)

通常,您要对该列进行GROUP BY,但这需要为所有其他列指定聚合函数。在你的情况下可能有用,因为你说其他专栏并不重要(这让我想知道为什么他们会被退回)。

SELECT T.Template_Id, Max(T.TemplateName), 
Max(CONVERT(NVARCHAR(MAX),T.CatalogDescription)), Max(T.MasterNo), Max(T.Customer_Id), 
Max(O.Quantity), Max(O.Cost) 
FROM Template as T INNER JOIN [Order] as O ON T.Template_Id=O.Template_Id 
GROUP BY T.Template_Id
ORDER BY O.Cost

答案 2 :(得分:0)

SQL不允许您仅聚合数据集中的特定字段,它们必须全部聚合。如果它确实像VFP和允许这样的其他数据库引擎那样,只需选择一行来填充其他值。

如果你想要实现我相信你的目标,那么你需要一个字段的所有不同值的列表,只需要其他字段的样本。

在使用Rank和Row_Number等窗口函数之前,我已经完成了这项工作,具体取决于我想要完成的工作。这样,您还可以选择样品,例如按OrderDate Desc订购,以便从客户的最新订单中获取样品字段。