SQL查询SELECT-one中的多个列需要是不同的

SQL查询SELECT-one中的多个列需要是不同的,sql,sql-server,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 ORD

这是我的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\u Id
be
DISTINCT
,这是我找不到的方法。其他列不重要,只要它们在那里并且
t.Template\u Id
列是
独立的(无重复项)

其他领域并不重要

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

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)
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
只要您使用的是同一订单记录中的字段,那么在使用哪个对应的
Order
字段并不重要的查询中就不太常见了。在这种情况下,您可以这样做:

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)
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
当然,假设至少在
模板
表中的记录基于ID已经是唯一的。这样做的好处是,只需在嵌套查询中添加一个
order by
子句,就可以更容易地选择要选择的顺序



*提示:事实证明这种情况很少发生。您几乎总是会发现,在某些情况下,它确实很重要,至少对其中一个字段是如此。

通常您会按该列分组,但这需要为所有其他列指定聚合函数。在您的情况下,这可能会起作用,因为您说其他列不重要(这让我想知道为什么要返回它们)


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

如果您试图实现我所认为的目标,那么您需要一个包含一个字段的所有不同值的列表,以及其他字段的一个示例


在使用诸如Rank和Row_Number之类的窗口函数之前,我已经完成了这项工作,这完全取决于我试图完成的任务。如果您想从客户最近的订单中获取样本字段,例如按OrderDate Desc订购,您也可以选择样本。

我认为您应该按成本而不是O.成本订购。@Abdullah
O.Cost
很好,而且通常是首选。很难想象在引用列时排除表别名会更有利。对不起,我的意思是按表示最大O.Cost的列排序。这就是我所需要的。我在其他地方看到了类似的情况,但无法理解如何使用
MAX
。例如:我认为它只会返回
数量
成本
的最高结果。我现在明白了它的工作方式。聚合函数只返回组内的结果。很好的解释。我对答案的唯一建议是给聚合函数列名称。