簡體   English   中英

將查詢結果傳遞給子查詢

[英]Passing query result into subquery

SELECT alert,  
  (select created_at from alerts 
    WHERE alert = @ALERT ORDER BY created_at desc LIMIT 1) 
      AS latest FROM alerts GROUP BY alert; 

我在上面的查詢中遇到了一個問題,我想將每個警報傳遞到子查詢中,以便我有一個名為“最新”的列,該列顯示每組警報的最新警報。 我應該怎么做?

這稱為相關子查詢。 要使其正常工作,您需要表別名:

SELECT a1.alert,  
       (select a2.created_at
        from alerts a2
        WHERE a2.alert = a1.alert
        ORDER BY a2.created_at desc
        LIMIT 1
       )  AS latest
FROM alerts a1
GROUP BY a1.alert; 

表別名是一種很好的習慣,因為表別名通常會使SQL更具可讀性。 將表別名與列引用一起使用也是一個好主意,因此您可以輕松地知道列的來源。

編輯:

如果您真的想要最新的,可以通過以下操作獲得它:

select alert, max(created_at)
from alerts
group by alert;

我會做以下

SELECT 
    alert_group_name, 
    MAX(created_at) AS latest 
FROM 
     alerts A 
GROUP BY 
     alert_group_name; 

如果您嘗試獲取每組警報的最新created_at日期,則有一種更簡單的方法。

SELECT
    alert,
    max (created_at) AS latest
FROM
    alerts
GROUP BY
    alert;

對於相關子查詢,您需要引用外部查詢中的表達式。

最好的方法是在外部查詢中為表分配別名,然后在內部查詢中引用該別名。 最佳實踐是為每個表引用分配一個別名,並限定每個列引用。

要“修復”查詢,所需要做的就是用對外部查詢表中alert列的引用替換對“ @ALERT ”的引用。

在我們的商店中,該語句的格式如下:

SELECT a.alert
     , (SELECT l.created_at 
          FROM alerts l
         WHERE l.alert = a.alert 
         ORDER BY l.created_at DESC
         LIMIT 1
       ) AS latest
  FROM alerts a 
 GROUP
    BY a.alert

不是因為那樣寫起來更容易,而是更重要的是,它更易於閱讀和理解語句的作用。

相關子查詢方法對於返回的少量行(在最外面的查詢上非常嚴格的WHERE子句)可能是有效的。但是通常,SELECT列表中的相關子查詢可以使(在我們的商店中引用) LDQ“調光查詢”。

在我們的商店中,如果我們需要該查詢返回的結果集,則該語句可能會被重寫為:

SELECT a.alert
     , MAX(a.created_at) AS latest
  FROM alerts a
 GROUP
    BY a.alert

而且,我們肯定會在ON alerts(alert,created_at)定義一個索引(或在前兩個索引之后具有其他列的索引)。

(我預計此語句不會返回不同的結果。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM