【问题标题】:Join results of multiple select statements in sqlsql中多个select语句的join结果
【发布时间】:2018-05-28 19:38:21
【问题描述】:

我有四个选择语句,我想将它们全部加入以仅获取公共行。

在一个示例中,我提供了 2 个选择语句:

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

Query Result

【问题讨论】:

  • 这适用于哪个 RDBMS?请添加标签以指定您使用的是mysqlpostgresqlsql-serveroracle 还是db2 - 或其他完全不同的东西。
  • 确定我会更新我的标签,它适用于 sql-server
  • 以文本形式发布表格和数据READ THIS
  • 查看查询结果后,您还需要在UNION上的每个查询中添加DISTINCT

标签: sql sql-server select join intersect


【解决方案1】:

暂时忘记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

查看查询结果后,您还需要将DISTINCT 添加到UNION 上的每个查询中。

【讨论】:

  • 感谢您的帮助,实际上我只是尝试使用 2 个 select 语句进行内部连接,它给了我想要的结果,但现在我正在考虑将其余的 2 个 select 语句。
  • 正如我所说,UNION 部分无关紧要。只需将 2 更改为 4
  • 谢谢,从常见的行中,我的意思是第一、第二、第三和第四个选择语句返回的相同行。我只想忽略所有 4 个结果集中都不可用的行,只想保留所有 4 个结果集中可用的行。希望这会有所帮助
  • 是的,看起来我就是这样做的
猜你喜欢
  • 2012-05-19
  • 2013-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-18
  • 1970-01-01
相关资源
最近更新 更多