簡體   English   中英

SQL:遍歷子查詢

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

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