sql select语句基于不同的列值

时间:2010-05-24 08:02:04

标签: sql-server-2005 select distinct

select distinct * from Drivers where IsDeleted=0给了我这个,

alt text http://www.imagechicken.com/uploads/1274691753099236100.jpg

我想根据不同的DriverMobNo

选择*

4 个答案:

答案 0 :(得分:1)

select * from Drivers  where DriverMobNo in (select DriverMobNo from Drivers where IsDeleted=0
 group by DriverMobNo ) and IsDeleted=0

答案 1 :(得分:1)

鉴于您有三行具有相同的DriverMobNo - 您在执行SELECT时需要这三行中的哪一行?任意一个?最近一个?最古老的一个??

你当然可以做一个

SELECT DISTINCT DriverMobNo FROM dbo.Drivers WHERE IsDeleted = 0

并获取那些不同的DriverMobNo值 - 但是如果您想拥有SELECT中的所有列,则需要更具体地说明要检索DriverMobNo = 9566643707的三行中的哪一行

更新:好的,你想要最老的一个 - 一种方法是使用CTE(公用表表达式):

WITH Drivers AS
(
    SELECT 
        DriverId, DriverName, DriverMobNo, CreatedDate,
        ROW_NUMBER() OVER (PARTITION BY DriverMobNo ORDER BY CreatedDate) 'RowNo'
    FROM dbo.Drivers 
    WHERE IsDeleted = 0
) 
SELECT DriverId, DriverName, DriverMobNo, CreatedDate
FROM Drivers
WHERE RowNo = 1

应该按DriverMobNo对数据进行“分区”,并按创建日期排序,因此RowNo = 1条目始​​终是每个DriverMobNo的最早条目。

答案 2 :(得分:1)

这将为每个DriverMobNo选择一个驱动程序。如果特定DriverMobNo有多个驱动程序,则返回第一个驱动程序。

select * from Drivers
where DriverId in (
  select min(DriverId) from Drivers
  where IsDeleted = 0
  group by DriverMobNo
)

答案 3 :(得分:0)

有点难以理解你想要的东西。

因为你有独特的行,你必须使用你需要的颜色。

例如

SELECT DISTINCT DriveMobNo, 创建日期 从 驱动程序 哪里 IsDeleted = 0

会为您提供唯一的驱动程序编号和创建的日期,但您仍然会有相同的手机号码返回两次,因为那里有不同的日期