2015-09-04 62 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