繁体   English   中英

在SQL中联接多个选择语句的结果

[英]Join results of multiple select statements in sql

我有四个select语句,我想将它们全部加入,只得到公共行。

在一个示例中,我提供了2条select语句:

SELECT 
    h.userid, 'Activity' as table_name, 
    h.stamp, 
    DATEDIFF(dd, kh.LatestDate, GETDATE()) as days_since, 
    m.group_name
FROM 
    ([Animal].[SYSADM].[activity_history] h
INNER JOIN 
    (SELECT userid, MAX(stamp) as LatestDate
     FROM [Animal].[SYSADM].[activity_history]
     GROUP BY userid) kh ON h.userid = kh.userid AND h.stamp = kh.LatestDate)  
LEFT OUTER JOIN 
    [Animal].[SYSADM].secure_member m ON m.user_name = h.userid
WHERE 
    (DATEDIFF(dd, kh.LatestDate, GETDATE()) > 90)
    AND NOT (m.group_name = 'inactive')
ORDER BY 
    userid

SELECT 
    h.userid, 'Person' as table_name, h.stamp, 
    DATEDIFF(dd, kh.LatestDate, GETDATE()) as days_since, 
    m.group_name
FROM 
    ([Animal].[SYSADM].[person_history] h
INNER JOIN 
    (SELECT userid, max(stamp) as LatestDate
     FROM [Animal].[SYSADM].[person_history]
     GROUP BY userid) kh ON h.userid = kh.userid AND h.stamp = kh.LatestDate)  
LEFT OUTER JOIN 
    [Animal].[SYSADM].secure_member m ON m.user_name = h.userid
WHERE 
    (DATEDIFF(dd, kh.LatestDate, GETDATE()) > 90)
    AND NOT (m.group_name = 'inactive')
ORDER BY 
    userid

我已经尝试过INTERSECT ,但是它没有返回任何行,我想查看两个select语句中的公共行(实际上我有4个,所以我相信2的工作原理将适用于4)

提前致谢。

更新:

我在2条select语句上尝试了内部联接,它给了我想要的结果,但是现在的问题是我如何在4条select语句上使用内部联接。

SELECT DISTINCT t1.userid as A_UserID, t2.userid as P_UserID, t1.stamp as A_stamp, t2.stamp as P_stamp, datediff(dd,t1.stamp,GetDate()) as A_days_since, datediff(dd,t2.stamp,GetDate()) as P_days_since, t1.group_name, t1.table_name, t2.table_name
from 
    (SELECT h.userid, 'Activity' as table_name, h.stamp, datediff(dd,kh.LatestDate,GetDate()) as days_since, m.group_name
  FROM 
 ( [Animal].[SYSADM].[activity_history] h
inner join (
    select userid, max(stamp) as LatestDate
  from [Animal].[SYSADM].[activity_history]
  group by userid
  ) kh on h.userid = kh.userid and h.stamp = kh.LatestDate
  )  
left outer join [Animal].[SYSADM].secure_member m on m.user_name = h.userid
where 
(datediff(dd,kh.LatestDate, GetDate()) > 90)
and not (m.group_name = 'inactive')) t1

inner join

    (SELECT h.userid, 'Person' as table_name, h.stamp, datediff(dd,kh.LatestDate,GetDate()) as days_since, m.group_name
  FROM 
 ( [Animal].[SYSADM].[person_history] h
inner join (
    select userid, max(stamp) as LatestDate
  from [Animal].[SYSADM].[person_history]
  group by userid
  ) kh on h.userid = kh.userid and h.stamp = kh.LatestDate
  )  
left outer join [Animal].[SYSADM].secure_member m on m.user_name = h.userid
where 
(datediff(dd,kh.LatestDate, GetDate()) > 90)
and not (m.group_name = 'inactive')) t2
on
    t1.userid = t2.userid
    order by T1.userid

查询结果

暂时忘掉UNION 假设您得到该结果并插入到Table1

然后,根据您的意思说“普通行”。 如果您想要确切的值但在不同的表中

  SELECT userid, h.stamp, days_since, m.group_name
  FROM Table1
  GROUP BY userid, h.stamp, days_since, m.group_name
  HAVING COUNT( table_name ) = 2 -- in this case 2 because are two types 
                                 -- Activity and Persons

查看查询结果后,还需要向UNION上的每个查询中添加DISTINCT

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM