簡體   English   中英

將多個查詢合並為一個

[英]Combining multiple queries into one

是否可以將多個查詢合而為一?

我有2個:

SELECT DATEDIFF(CURRENT_DATE, cl.updated_at) AS Diff
FROM Table
WHERE Color = 'Red'

SELECT DATEDIFF(CURRENT_DATE, cl.updated_at) AS Diff
FROM Table
WHERE Color = 'Blue'

現在我要兩個查詢

所以是這樣嘗試:

SELECT
(
SELECT DATEDIFF(CURRENT_DATE, cl.updated_at) AS Diff
FROM Table
WHERE Color = 'Red'
)
(
SELECT DATEDIFF(CURRENT_DATE, cl.updated_at) AS Diff2
FROM Table
WHERE Color = 'Blue'
)

但是要做好工作:(

您可以使用帶有IN運算符的單個查詢。 這是多個OR條件的縮寫:

SELECT DATEDIFF(CURRENT_DATE, cl.updated_at) AS Diff
FROM Table
WHERE Color IN ( 'Red', 'Blue' )

如果您真的堅持(勸阻)使用兩個查詢,則可以使用UNION ALL組合它們:

SELECT DATEDIFF(CURRENT_DATE, cl.updated_at) AS Diff
FROM Table
WHERE Color = 'Red'
UNION ALL -- does not remove duplicates from output
SELECT DATEDIFF(CURRENT_DATE, cl.updated_at) AS Diff
FROM Table
WHERE Color = 'Blue'

如果要刪除重復項,請使用UNION而不是UNION ALL


如果您需要在注釋中提到不同的結果列,請為此使用CASE語句。 不過,我確實沒有找到原因。

SELECT 
  CASE WHEN Color = 'Red' THEN DATEDIFF(CURRENT_DATE, cl.updated_at) END AS Diff,
  CASE WHEN Color = 'Blue' THEN DATEDIFF(CURRENT_DATE, cl.updated_at) END AS Diff2,
FROM Table
WHERE Color IN ( 'Red', 'Blue' )

對於第二種方法:

SELECT
  CASE WHEN Color = 'Red'  THEN Diff END AS Diff,
  CASE WHEN Color = 'Blue' THEN Diff END AS Diff2
FROM (
  SELECT Color, DATEDIFF(CURRENT_DATE, cl.updated_at) AS Diff
  FROM Table
  WHERE Color = 'Red'
  UNION ALL -- does not remove duplicates from output
  SELECT Color, DATEDIFF(CURRENT_DATE, cl.updated_at) AS Diff
  FROM Table
  WHERE Color = 'Blue'
) t

在這種情況下,它不只是更新where嗎?

SELECT DATEDIFF(CURRENT_DATE, cl.updated_at) AS Diff FROM Table WHERE Color = 'Blue' OR Color = 'red'

是的,您可以使用INNER JOIN或UNION,但是對於此示例,這將無用。

您可以使用UNION運算符來聯接兩個查詢。 https://www.w3schools.com/sql/sql_union.asp

如果所有查詢中的輸出列都相同,則可以使用UNION / UNION ALL如下所示:

SELECT DATEDIFF(CURRENT_DATE, cl.updated_at) AS Diff
FROM Table
WHERE Color = 'Red'

UNION

SELECT DATEDIFF(CURRENT_DATE, cl.updated_at) AS Diff
FROM Table
WHERE Color = 'Blue'

如果可以使用不同行中的值,則只需執行以下操作:

SELECT Color, DATEDIFF(CURRENT_DATE, cl.updated_at) AS Diff
FROM Table
WHERE Color IN ('Red', 'Blue');

我將Color添加到SELECT以便您可以區分行。

如果子查詢返回一個值,則您只是缺少逗號:

SELECT (SELECT DATEDIFF(CURRENT_DATE, cl.updated_at) AS Diff
        FROM Table
        WHERE Color = 'Red'
       ),
       (SELECT DATEDIFF(CURRENT_DATE, cl.updated_at) AS Diff2
        FROM Table
        WHERE Color = 'Blue'
       );

如果子查詢返回多行,則需要解釋所需的結果集。

編輯:

如果您希望這些值在兩個不同的列中對齊,則可以執行以下操作:

select max(diff_red) as diff_red, max(diff_blue) as diff_blue
from ((select (@rnr := @rnr + 1) as rn, 
              DATEDIFF(CURRENT_DATE, cl.updated_at) AS Diff_red,
              NULL AS Diff_blue
       from t cross join
            (select @rnr := 0) params
       where color = 'Red'
      ) union all
      (select (@rnb := @rnb + 1) as rn, 
              NULL AS Diff_red,
              DATEDIFF(CURRENT_DATE, cl.updated_at) AS Diff_blue
       from t cross join
            (select @rnrb:= 0) params
       where color = 'Blue'
      )
     ) rb
group by rn;

暫無
暫無

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

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