[英]SQL: Iterate through subquery
我目前正在處理一個查詢,該查詢標記最近10天內與其他任何電子郵件地址不同的所有訂單。
現在,我可以檢查最后一個訂單是否少於10天,但是否有3個訂單:
1. 2019/01/01
2. 2019/01/20
3. 2019/01/22
然后,所有它們都將得到是,因為nr 3將檢查nr1。因此,我需要在子查詢中構建一個循環,以遍歷具有相同電子郵件地址的所有子查詢。 請幫忙:)
SELECT TOP (1000)
OnlyOneWithin10Days =
CASE
WHEN (select top (1) inner.CreationDate
from [Database].[req].[PersonalDetail] as pd1
JOIN req.OfferRequest ofreq on ofreq.MainDriverPersonalDetailID = inner.ID
JOIN rsp.InsuranceResponse inresp on ofreq.InsuranceResponseID = inresp.id
JOIN adm.ProductBundle inner2 on inresp.ProductBundleID = inner2.ID
where inner.Email = personalDetail.Email
and inner2.ID = pb.ID
and personalDetail.id > inner.ID
and inner.CreationDate < personalDetail.CreationDate
order by inner.CreationDate desc) is NULL
OR datediff(MINUTE, (select top (1) inner.CreationDate
from [Database].[req].[PersonalDetail] as inner
JOIN req.OfferRequest ofreq on ofreq.MainDriverPersonalDetailID = inner.ID
JOIN rsp.InsuranceResponse inresp on ofreq.InsuranceResponseID = inresp.id
JOIN adm.ProductBundle inner2 on inresp.ProductBundleID = inner2.ID
where inner.Email = personalDetail.Email
and inner2.ID = pb.ID
and personalDetail.id > inner.ID
and inner.CreationDate < personalDetail.CreationDate
--and datediff(MINUTE, inner.CreationDate, personalDetail.CreationDate) >= 10
order by inner.CreationDate desc), personalDetail.CreationDate) >= 10
THEN 'Yes'
ELSE 'No'
END
,personalDetail.CreationDate
,pb.Name product
,personalDetail.Name
,personalDetail.email
,i.Name insurance
FROM [Database].[req].[OfferRequest] as oreq
JOIN req.PersonalDetail personalDetail on oreq.MainDriverPersonalDetailID = personalDetail.ID
JOIN rsp.InsuranceResponse ir on oreq.InsuranceResponseID = ir.ID
JOIN adm.ProductBundle pb on ir.ProductBundleID = pb.ID
JOIN adm.Insurance i on pb.InsuranceID = i.ID
order by personalDetail.Email, personalDetail.CreationDate
編輯:我正在使用SSMS(Microsoft SQL Server Management Studio 14.0.17289.0)
Edit2:對不起,如果我的問題有點令人困惑,但是我是stackOverflow的新手。
結果應該看起來像這樣
您發布了想要的東西,所以這里是如何做的-在具體確定想要的東西之前,請參見下面的詳細信息,以了解它的工作原理:
SELECT TABLE1.*, CASE WHEN SUB.PRIOR = 0 THEN 'YES' ELSE 'NO' END AS OnlyEmail10days
FROM TABLE1
JOIN (
SELECT BASE.EMAIL, COUNT(PROIR.EMAIL) AS PRIOR
FROM TABLE1 AS BASE
LEFT JOIN TABLE1 AS PRIOR ON BASE.EMAIL = PROIR.EMAIL AND DATEDIFF(day, PRIOR.DATE, BASE.DATE) <= 10
GROUP BY BASE.EMAIL
) AS SUB ON SUB.EMAIL = TABLE1.EMAIL
當然,TABLE1。*在這里是占位符,但是在您想要從TABLE1中獲得的確切字段中。
我不理解您的代碼,但這是您問題的答案:
假設您有一個名為TABLE1的表,它具有一個名為EMAIL的字段和一個名為DATE的字段
以下查詢
SELECT BASE.EMAIL, COUNT(PRIOR.EMAIL) AS CNT
FROM TABLE1 AS BASE
JOIN TABLE1 AS PRIOR ON BASE.EMAIL = PROIR.EMAIL AND DATEDIFF(day, PRIOR.DATE, BASE.DATE) <= 10
GROUP BY BASE.EMAIL
將在過去10天內返回所有使用相同電子郵件的行,並計算出多少行。
希望這可以幫助。 這就是SQL的工作方式,它使用集合而不是迭代。
它的工作方式是使用聯接-聯接是一個設置函數-我們為電子郵件和10天相同的項目集定義條件,SQL一次查找所有這些條件。 我們只希望對它們進行計數,這就是我們返回的結果(如果不需要計數,只需將該字段留在結果集中即可。)
如果您只希望最近10天內沒有電子郵件地址的項目,請使用以下查詢:
SELECT BASE.EMAIL
FROM TABLE1 AS BASE
LEFT JOIN TABLE1 AS PRIOR ON BASE.EMAIL = PROIR.EMAIL AND DATEDIFF(day, PRIOR.DATE, BASE.DATE) <= 10
WHERE PRIOR.EMAIL IS NULL
這里我們做的和以前一樣,但是因為它是左連接,所以我們可以采用沒有任何連接元素的集合。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.