在SQL中使用distinct函数

时间:2009-07-22 10:53:28

标签: sql

我正在运行一个SQL查询。我想知道的是,是否有一种方法可以选择表中的行,其中一列中的值是不同的?当我使用distinct函数时,它返回所有不同的行,所以......

select distinct teacher from class etc.

这很好用,但我选择了多个列,所以......

select distinct teacher, student etc.

但我不想检索不同的行,我希望教师与众不同的不同行。因此,这个查询可能会多次返回相同的教师姓名,因为学生价值不同,但我想要的是返回教师不同的行,即使这意味着返回教师和一个学生姓名(因为我没有需要所有学生。)

我希望我想要提出的问题是明确的,但是即使在选择多个列时,是否可以在单个列上使用distinct函数,或者是否有任何其他解决方案可以解决此问题?感谢。


以上只是我给出的一个例子。我不知道使用'distinct'是否可以解决我的问题。我没有使用老师等,这只是一个让这个想法得到满足的例子。我从不同的表中选择多个列(大约10个)。我有一个查询来获取我想要的表格结果。现在我想查询该表以查找一个特定列中的唯一值。所以再次使用老师的例子,说我写了一个查询,我有所有老师和他们教的所有学生。现在,我想浏览此表中的每一行,并通过电子邮件向教师发送消息。但我不想多次给老师发电子邮件,只是一次,所以我想从表中返回所有列,只有教师价值不同。

Col A Col B Col C Col D

a b c d

a c d b

b a a c

b c c c

我生成上表的查询。现在我只想要那些Col A值唯一的行。我该怎么做呢?

18 个答案:

答案 0 :(得分:11)

您误解了DISTINCT关键字。它不是一个函数,也不会修改列。你不能SELECT a, DISTINCT(b), c, DISTINCT(d) FROM SomeTable。 DISTINCT是查询本身的修饰符,即您不选择不同的列,而是进行SELECT DISTINCT查询。

换句话说:DISTINCT告诉服务器遍历整个结果集,并在执行查询后删除所有重复的行

如果您需要一列包含每个值一次,则需要GROUP BY该列。一旦你这样做,服务器现在需要做哪个学生选择每个教师,如果有多个,所以你需要提供所谓的aggregate function像COUNT()。例如:

SELECT teacher, COUNT(student) AS amountStudents
FROM ...
GROUP BY teacher;

答案 1 :(得分:2)

根据您在问题中提供的有限详细信息(您应该解释数据在不同表中的方式/原因,使用的数据库服务器等),您可以从2个不同的方向进行处理。

  1. 减少查询中的列数,只返回“teacher”和“email”列,但使用现有的WHERE条件。您当前尝试遇到的问题是DISTINCT和GROUP BY都不明白您想要分离的列的每个值都需要1行。根据我的理解,MySQL支持使用GROUP BY执行的操作,但MSSQL不支持GROUP BY语句中未包含的结果列。如果您不需要“student”列,请不要将它们放在结果集中。

  2. 转换现有查询以使用基于列的子查询,这样您只能为非分组数据返回单个结果。

  3. 示例:

    SELECT t1.a
            , (SELECT TOP 1 b FROM Table1 t2 WHERE t1.a = t2.a) AS b
            , (SELECT TOP 1 c FROM Table1 t2 WHERE t1.a = t2.a) AS c
            , (SELECT TOP 1 d FROM Table1 t2 WHERE t1.a = t2.a) AS d
        FROM dbo.Table1 t1
        WHERE (your criteria here)
        GROUP BY t1.a
    

    如果您拥有大量数据,此查询将不会很快,但每个教师将返回一行,其余列的值有些随机。您还可以为每个子查询添加ORDER BY,以进一步调整为其他列返回的值。

答案 2 :(得分:2)

我不确定我是否理解这一点,但你不能这样做

SELECT * FROM class WHERE teacher IN (SELECT DISTINCT teacher FROM class)

这将返回教师不同的每一行中的所有数据

答案 3 :(得分:2)

一种选择是在Col A上使用GROUP BY。示例:

SELECT * FROM table_name GROUP BY Col A

那应该归还你:

ABCD

BAAC

答案 4 :(得分:1)

distinct需要一个唯一的结果集行。这意味着您从表中选择的任何值都需要作为结果集中任何其他行的一行区分开来。

使用distinct可以从给定字段多次返回相同的值,只要该行中的其他相应字段也是不同的。

答案 5 :(得分:1)

soulmerge Shiraz 提到您需要使用GROUP BY和subselect。这对我有用。

DECLARE @table TABLE (
    [Teacher] [NVarchar](256) NOT NULL ,
    [Student] [NVarchar](256) NOT NULL 
)

INSERT INTO @table VALUES ('Teacher 1', 'Student 1')
INSERT INTO @table VALUES ('Teacher 1', 'Student 2')
INSERT INTO @table VALUES ('Teacher 2', 'Student 3')
INSERT INTO @table VALUES ('Teacher 2', 'Student 4')

SELECT 
    T.[Teacher],  
    (
        SELECT TOP 1 T2.[Student]
        FROM @table AS T2 
        WHERE T2.[Teacher] = T.[Teacher]
    ) AS [Student]
FROM @table AS T
GROUP BY T.[Teacher]

结果

Teacher 1, Student 1
Teacher 2, Student 3

答案 6 :(得分:0)

Users

答案 7 :(得分:0)

declare @temp as table (colA nchar, colB nchar, colC nchar, colD nchar, rownum int)

insert @temp (colA, colB, colC, colD, rownum)
select Test.ColA, Test.ColB, Test.ColC, Test.ColD, ROW_NUMBER() over (order by ColA) as rownum
    from Test

select t1.ColA, ColB, ColC, ColD
from @temp as t1
join (
    select ColA, MIN(rownum) [min]
    from @temp
    group by Cola)
 as t2 on t1.Cola = t2.Cola and t1.rownum = t2.[min]

这将为colA的每个值返回一行。

答案 8 :(得分:0)

似乎没人理解你想要什么。我会再猜一次。

Select * from tbl
Where ColA in (Select ColA from tbl Group by ColA Having Count(ColA) = 1)

这将返回ColA唯一的行-i.e中的所有数据。没有另一行具有相同的ColA值。当然,这意味着您提供的样本数据中的行数为零。

答案 9 :(得分:0)

以下内容可帮助您找到解决方案。另一张海报确实指出了这一点,但他的分组语法不正确。

让所有教授任何课程的老师。

   Select teacher_id, count(*)
    from teacher_table inner join classes_table
    on teacher_table.teacher_id = classes_table.teacher_id
    group by teacher_id

答案 10 :(得分:0)

select cola,colb,colc 
from yourtable
where cola in 
(
  select cola from yourtable where your criteria group by cola having count(*) = 1
)

答案 11 :(得分:0)

您只需选择您想要第一列的列,然后选择“区别

Select Distinct column1 -- where your criteria...

答案 12 :(得分:0)

您可以使用GROUP BY根据单个列值分隔返回值。

答案 13 :(得分:0)

我很难准确理解你想做什么......但你可以这样做:

SELECT DISTINCT ColA FROM Table WHERE ...

如果您只选择一个单数列,则distinct将仅获取这些列。

如果你能澄清一点,我可以尝试多一点帮助。

答案 14 :(得分:0)

您需要说明数据是如何存储在内存中的,以便我们说明如何查询数据。

但你可以单独进行查询以获得不同的老师。

select distinct teacher from class

答案 15 :(得分:0)

您的查询试图回答的问题是什么?

您需要知道哪些班级只有一名教师吗?

select class_name, count(teacher) 
from class group by class_name having count(teacher)=1

或者您正在寻找只有一名学生的老师?

select teacher, count(student) 
from class group by teacher having count(student)=1

还是别的什么?您提出的问题假设使用DISTINCT是您正在尝试构建的查询的正确方法。似乎情况并非如此。你能用DISTINCT描述你想要回答的问题吗?

答案 16 :(得分:0)

您可以尝试“GROUP BY teacher”来返回您需要的内容。

答案 17 :(得分:0)

您需要使用子选择进行,您可以选择老师相同的学生TOP 1。