簡體   English   中英

SQL結合兩個查詢

[英]SQL Combining two queries

下面的代碼從兩個表中選擇記錄,其中電子郵件和dob匹配另一個記錄(所有重復。)

SELECT 
    AccountName, 
    EmailAddress, 
    DateOfBirth
FROM 
(
    SELECT 
        a.AccountName, 
        a.EmailAddress, 
        u.DateOfBirth, 
        COUNT(*) over (partition by a.EmailAddress, u.DateOfBirth) AS cnt
    FROM Account AS a 
    JOIN [User] AS u ON a.AccountID = u.AccountID              
) ua                
WHERE cnt > 1
AND EmailAddress IS NOT null
AND DateOfBirth IS NOT null     
ORDER BY EmailAddress, DateOfBirth 

我還想在此表中添加另一個名為“ Audit”的表中的字段。 我們可以使用LoginID加入他們,但是LoginID在Audit表中具有一對多的關系。 即,一個LoginID可以具有許多審核。

我要添加“審核開始日期”列。 以下查詢使我可以按日期標識最新的審核。

         SELECT  a.LoginID as AuditLoginID,
         MAX(StartDate) as StartDate
         FROM    Audit as a
         GROUP BY  a.LoginID
         ORDER BY a.StartDate

誰能建議我如何組合這兩個查詢,以便我的原始查詢具有到“審計”表的聯接,並顯示最新審計開始日期的“ StartDate”列?

您應該考慮使用相關子查詢 這樣可以避免構建另一個數據庫對象來支持此查詢,並且這是一個相對標准的SQL構造。

例:

SELECT 
    AccountName, 
    EmailAddress, 
    DateOfBirth
FROM 
(
    SELECT 
        a.AccountName, 
        a.EmailAddress, 
        u.DateOfBirth, 
        a.LoginID,
        COUNT(*) over (partition by a.EmailAddress, u.DateOfBirth) AS cnt
    FROM Account AS a 
    JOIN [User] AS u ON a.AccountID = u.AccountID              
) ua           
join Audit as a 
  on a.LoginID = au.LoginID     
WHERE cnt > 1
AND EmailAddress IS NOT null
AND DateOfBirth IS NOT null     
AND a.startdate = (SELECT MAX(StartDate) as StartDate
                   FROM    Audit as b
                   WHERE b.LoginID = a.LoginID)
ORDER BY EmailAddress, DateOfBirth 

這是我的評論的擴展:

CREATE VIEW MostRecentLogins AS
  (
     SELECT a.LoginID as AuditLoginID,
            MAX(StartDate) as StartDate
       FROM Audit as a
      GROUP BY a.LoginID
  )

然后,您可以將MostRecentLogins視圖加入其他查詢中。 從您的帖子中尚不清楚哪一列與LoginId對應(從Audit表中),但是查詢看起來像這樣:

SELECT a.AccountName, 
       a.EmailAddress, 
       u.DateOfBirth,
       MRL.StartDate
  FROM 
     (
       SELECT a.AccountName, 
              a.EmailAddress, 
              u.DateOfBirth, 
              COUNT(*) over (partition by a.EmailAddress, u.DateOfBirth) AS cnt
         FROM Account AS a 
              JOIN [User] AS u 
                       ON a.AccountID = u.AccountID              
     ) ua
     INNER JOIN MostRecentLogins MRL
         ON MRL.LoginID = a.LoginID    -- not sure what column should be on the RHS of this..
  WHERE cnt > 1
    AND EmailAddress IS NOT null
    AND DateOfBirth IS NOT null     
  ORDER BY EmailAddress, DateOfBirth 

暫無
暫無

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

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