[英]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.