32

我正在尝试编写一个 SQL 查询,该查询从表中选择多个列,并且仅在一列上使用 distinct 运算符。

表很简单。这些列是:

tblFruit_ID, tblFruit_FruitType, tblFruit_FruitName
int          NVarChar            Text

我正在尝试选择所有 tblFruit_FruitType 及其对应的 tblFruit_ID。

我试过了:

Select Distinct(tblFruit_FruitType), tblFruit_ID FROM tblFruit

-返回所有结果,而不仅仅是不同的

Select tblFruit_FruitType, tblFruit_ID FROM tblFruit Group By tblFruit_FruitType

- 列 tblFruit_ID 的错误在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中。

Select tblFruit_FruitType, tblFruit_ID FROM tblFruit Group By tblFruit_FruitType, tblFruit_ID

-返回所有结果,而不仅仅是不同的

我还查看了这些类似的帖子,但没有任何工作:(

mySQL 选择一列 DISTINCT,与对应的其他列

一列的 SQL Server Distinct Union

希望这是足够的信息来回答。

感谢您的时间!

编辑(样本数据和所需结果)

tblFruit_ID, tblFruit_FruitType, tblFruit_FruitName
int          NVarChar            Text
1            Citrus              Orange
2            Citrus              Lime
3            Citrus              Lemon
4            Seed                Cherry
5            Seed                Banana

结果:

1            Citrus
4            Seed
4

7 回答 7

42
select * from tblFruit where
tblFruit_ID in (Select max(tblFruit_ID) FROM tblFruit group by tblFruit_FruitType)
于 2012-08-13T15:26:45.707 回答
24

您必须对未分组的列使用聚合函数。在这个例子中,我随意选择了 Min 函数。您正在组合具有相同FruitType值的行。例如,如果我有两行值相同FruitType但值不同Fruit_Id,系统应该怎么做?

Select Min(tblFruit_id) As tblFruit_id
    , tblFruit_FruitType
From tblFruit
Group By tblFruit_FruitType

SQL 小提琴示例

于 2012-08-13T15:16:08.963 回答
1

您有多种方法可以在一列或多列上区分值。

  • 使用 GROUP BY

    SELECT DISTINCT MIN(o.tblFruit_ID)  AS tblFruit_ID,
       o.tblFruit_FruitType,
       MAX(o.tblFruit_FruitName)
    FROM   tblFruit  AS o
    GROUP BY
         tblFruit_FruitType
    
  • 使用子查询

    SELECT b.tblFruit_ID,
       b.tblFruit_FruitType,
       b.tblFruit_FruitName
    FROM   (
           SELECT DISTINCT(tblFruit_FruitType),
                  MIN(tblFruit_ID) tblFruit_ID
           FROM   tblFruit
           GROUP BY
                  tblFruit_FruitType
       ) AS a
       INNER JOIN tblFruit b
            ON  a.tblFruit_ID = b.tblFruit_I
    
  • 使用带有子查询的连接

    SELECT t1.tblFruit_ID,
        t1.tblFruit_FruitType,
        t1.tblFruit_FruitName
    FROM   tblFruit  AS t1
       INNER JOIN (
                SELECT DISTINCT MAX(tblFruit_ID) AS tblFruit_ID,
                       tblFruit_FruitType
                FROM   tblFruit
                GROUP BY
                       tblFruit_FruitType
            )  AS t2
            ON  t1.tblFruit_ID = t2.tblFruit_ID 
    
  • 使用窗口函数只有一列不同

    SELECT tblFruit_ID,
        tblFruit_FruitType,
        tblFruit_FruitName
    FROM   (
             SELECT tblFruit_ID,
                  tblFruit_FruitType,
                  tblFruit_FruitName,
                  ROW_NUMBER() OVER(PARTITION BY tblFruit_FruitType ORDER BY tblFruit_ID) 
        rn
           FROM   tblFruit
        ) t
        WHERE  rn = 1 
    
  • 使用窗口函数多列不同

    SELECT tblFruit_ID,
        tblFruit_FruitType,
        tblFruit_FruitName
    FROM   (
             SELECT tblFruit_ID,
                  tblFruit_FruitType,
                  tblFruit_FruitName,
                  ROW_NUMBER() OVER(PARTITION BY tblFruit_FruitType,     tblFruit_FruitName 
        ORDER BY tblFruit_ID) rn
              FROM   tblFruit
         ) t
        WHERE  rn = 1 
    
于 2019-12-17T08:18:24.167 回答
0

我需要做同样的事情,并且必须查询一个查询才能得到结果

我将第一个查询设置为从表中引入所有 ID 以及过滤所需的所有其他信息:

SELECT tMAIN.tLOTS.NoContract, tMAIN.ID
FROM tMAIN INNER JOIN tLOTS ON tMAIN.ID = tLOTS.id
WHERE (((tLOTS.NoContract)=False));

将此另存为 Q04_1 -0 这返回 1229 个结果(有 63 条唯一记录要查询 - 具有多个 LOT)

SELECT DISTINCT ID
FROM q04_1;

另存为 q04_2

然后我写了另一个查询,它引入了与 ID 相关的所需信息

SELECT q04_2.ID, tMAIN.Customer, tMAIN.Category
FROM q04_2 INNER JOIN tMAIN ON q04_2.ID = tMAIN.ID;

辛苦了,得到了我所需要的——63 条独特的记录返回了客户和类别的详细信息。

这就是我解决它的方式,因为我根本无法通过工作来获得小组 - 尽管我对 SQL 相当“耳后”(所以请对反馈保持温和和建设性)

于 2017-11-03T14:39:37.083 回答
0
select * from 
(select 
ROW_NUMBER() OVER(PARTITION BY tblFruit_FruitType ORDER BY tblFruit_FruitType DESC) as tt
,*
from tblFruit
) a
where a.tt=1
于 2019-02-12T10:05:14.860 回答
0

我想最简单和最好的解决方案是使用OUTER APPLY. 您只使用一个字段,DISTINCT但要检索有关该记录的更多数据,您使用OUTER APPLY.

要测试解决方案,请执行以下查询,该查询首先创建一个临时表,然后检索数据:

 DECLARE @tblFruit TABLE (tblFruit_ID int, tblFruit_FruitType varchar(10), tblFruit_FruitName varchar(50))
 SET NOCOUNT ON
 INSERT @tblFruit VALUES (1,'Citrus ','Orange')
 INSERT @tblFruit VALUES (2,'Citrus','Lime')
 INSERT @tblFruit VALUES (3,'Citrus','Lemon')
 INSERT @tblFruit VALUES (4,'Seed','Cherry')
 INSERT @tblFruit VALUES (5,'Seed','Banana')
   
SELECT DISTINCT (f.tblFruit_FruitType), outter_f.tblFruit_ID
FROM @tblFruit AS f
OUTER APPLY (
    SELECT TOP(1) *
    FROM @tblFruit AS inner_f
    WHERE inner_f.tblFruit_FruitType = f.tblFruit_FruitType
) AS outter_f

结果将是:

Citrus 1

Seed 4

于 2020-11-07T14:08:09.910 回答
0
SELECT * FROM table_name GROUP BY columnName

这将从表中选择所有具有不同值的列 columnName

于 2021-12-10T05:07:13.377 回答