2015-09-04 77 views
0

我在SQL小提琴中准备了这个Demo。问题在于结果中第一行是重复的。我如何只显示一次。结果中的重复行

+1

只需添加'distinct' [DEMO小提琴(http://sqlfiddle.com/#!9/eaa3bb/3) – Crazy2crack

+0

虽然有准备的小提琴是伟大的,它是很好,如果查询实际上是在问题中(连同最小的表格定义和重现问题所需的数据),因为外部链接可能不可靠,并且可能在未来消失。 – jpw

+0

@jpw:好的,谢谢你的建议。 –

回答

2

我不认为加入distinct会给你正确的结果,我认为真正的问题是,你只参加rides表上的一个外键(idRide)和而不是其他(idUser)。

此外,混合隐式连接(在from子句中)与显式连接(使用join关键字)不是一个好主意 - 最好是一致地使用显式连接。

我相信正确的查询应该是:

SELECT 
    register.IdRide, 
    users.IdUser, 
    users.Name, 
    (CASE WHEN rides.IdRide IS NOT NULL THEN 1 ELSE 0 END) As IsDriver 
FROM 
    register 
JOIN 
    users ON register.IdUser = users.IdUser 
LEFT JOIN 
    rides ON rides.IdUser = users.IdUser 
     AND rides.IdRide = register.IdRide 
WHERE 
    register.IdRide IN (1) ; 

与样品的数据,这将返回:

| IdRide | IdUser | Name | IsDriver | 
|--------|--------|------|----------| 
|  1 |  1 |  |  1 | 
|  1 |  2 |  |  0 | 
|  1 |  3 |  |  0 | 

简单地增加distinct将标志着ID用户为IsDriver = 1,这,看着数据,似乎不正确。

Sample SQL Fiddle

0

使用不同

SELECT distinct register.IdRide, users.IdUser, users.Name, 
(CASE WHEN rides.IdRide IS NOT NULL THEN 1 
    ELSE 0 
END 
)As IsDriver 
FROM 
    register, 
    users 
     LEFT JOIN rides ON 
     users.IdUser =rides.IdUser 
WHERE 
    register.IdRide IN (1) 
    AND register.IdUser = users.IdUser 
+0

这很可能不会返回正确的结果,因为缺失的连接条件会导致将IdUser 2标记为驱动程序,因为它只应该是IdUser 1。 – jpw