2014-08-28 283 views
-4

我在這裏閱讀了很多答案,但直到現在沒有任何東西可以幫助我。我正在開發一個門票系統,每張門票都有很多更新。SELECT DISTINCT返回比預期更多的行

我有大約2個表格:tb_tickettb_updates

我創建了一個SELECT子查詢,它花了很長時間(大約25秒)獲得大約1000行。現在我將其更改爲INNER JOIN而不是子查詢中的許多SELECT,它非常快(70毫秒),但是現在我獲得了重複票據。我想知道如何才能得到最後一行(按時間排序)。

我現在的結果是:

... 
67355;69759;"COMPANY X";"2014-08-22 09:40:21";"OPEN";"John";1 
67355;69771;"COMPANY X";"2014-08-26 10:40:21";"UPDATE";"John";1 

的第一列是票ID,二是更新ID ...我想只能得到每票ID一排,但在這種情況下,DISTINCT不起作用。哪一行應該是?總是最新的,所以在這種情況下,2014-08-26 10:40:21

更新: 這是一個postgresql數據庫。我沒有分享我目前的查詢,因爲它只有葡萄牙語的名字,所以我認爲它根本沒有幫助。

SOLUTION: Used_By_Already了我的問題的最佳解決方案。

+3

什麼是DBMS? – Dimt 2014-08-28 12:29:58

+3

如果您可以給我們您的SQL語句與 – Marco 2014-08-28 12:31:05

+0

一起使用,那麼會很有光澤您的表的前綴爲'tb_'。出於興趣,您的存儲過程是否爲前綴'sp_'? – 2014-08-28 12:31:11

回答

3

沒有你的表的詳細內容的有猜字段名,但似乎tb_updates在tb_ticket(多對一關係)中有多條記錄。

問題的一般解決方案 - 只獲取「最新」記錄 - 是在tb_updates上使用子查詢(請參見下面的別名mx),然後將它加回到tb_updates,以便只有具有最新日期的記錄被選中。

SELECT 
     t.* 
    , u.* 
FROM tb_ticket t 
     INNER JOIN tb_updates u 
        ON t.ticket_id = u.ticket_id 
     INNER JOIN (
        SELECT 
         ticket_id 
         , MAX(updated_at) max_updated 
        FROM tb_updates 
        GROUP BY 
         ticket_id 
      ) mx 
        ON u.ticket_id = mx.ticket_id 
         AND u.updated_at = mx.max_updated 
; 

如果您有支持ROW_NUMBER一個DBMS(),然後使用該函數可以是一個非常有效的替代方法,但是你有沒有告知我們您正在使用的DBMS。


的方式: 這些行是不同的:

67355;69759;"COMPANY X";"2014-08-22 09:40:21";"OPEN";"John";1 
67355;69771;"COMPANY X";"2014-08-26 10:40:21";"UPDATE";"John";1 

69759是69771不同,這是足夠的2行是DISTINCT 中有2個日期也差。

distinct是一個row operator這意味着在決定哪些行是唯一的時候,會考慮整行,而不僅僅是第一列。

+0

即使我提供的信息很差,也可以完全解決我的問題。不可思議!非常感謝,它非常完美!那就是我正在尋找的! – 2014-08-28 13:26:40

+0

不幸的是,你不明白的地方在於,它不僅僅是爲了解決你的問題,而是要提出明確的問題和解決方案,以幫助像你(或我)這樣的其他人在未來。一個好問題不會提供「不良信息」。 – Frazz 2014-08-28 15:07:41

0

U可以嘗試像下面如果你updateid是標識列:

Select ticketed, max(updateid) from table 
group by ticketed 
0

爲了得到你要結束你的查詢與order by time desc然後使用TOP (1)在select語句選擇僅在第一行的最後一行查詢結果

例如:

select TOP (1) ..... 
     from ..... 
     where ..... 
     order by time desc 
1

Used_By_Already的解決方案將工作得很好。我不確定性能,但另一種解決方案是使用交叉應用,但僅限於少數幾個DBMS。

SELECT * 
FROM tb_ticket ticket 
CROSS APPLY (
    SELECT top(1) * 
    FROM tb_updates details 
    ORDER BY updateTime desc 
    WHERE details.ticketID = ticket.ticketID 
    ) updates 
+0

事實上,如果updatedTime值有一條平行線,它可以防止獲得超過1條記錄。但是,@ Kiklion我可能會建議row_number()交叉應用之前,因爲它是更廣泛的可用。 – 2014-08-29 00:50:39

相關問題