SQL查询多列仅在一列上使用不同

时间:2012-08-13 15:12:46

标签: sql-server select

我正在尝试编写一个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 select one column DISTINCT, with corresponding other columns

SQL Server Distinct Union for one column

希望这是一个足够的答案信息。

感谢您的时间!

编辑(样本数据和期望结果)

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

6 个答案:

答案 0 :(得分:29)

select * from tblFruit where
tblFruit_ID in (Select max(tblFruit_ID) FROM tblFruit group by tblFruit_FruitType)

答案 1 :(得分:22)

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

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

SQL Fiddle example

答案 2 :(得分: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的soime)

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条与客户和类别详细信息相关的独特记录。

这就是我解决这个问题的方法,因为我无法通过工作来完成工作 - 虽然我相当“浑浑噩噩”,但仍然很谨慎(所以请保持温和和建设性的反馈)

答案 3 :(得分: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

答案 4 :(得分:0)

您可以通过多种方法来区分一列或多列中的值。

  • 使用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 
    

答案 5 :(得分: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