【问题标题】:Join multiple tables with result set of another Query将多个表与另一个查询的结果集连接起来
【发布时间】:2015-07-16 05:04:20
【问题描述】:

我需要连接多个表以及选择查询的结果集,该查询本身使用 UNION 运算符从两个表中获取数据。 以下查询没有给出任何错误,但在数据存在时不返回数据。请告诉我这个查询有什么问题。我怎样才能做到这一点。

查询:

SELECT max(a."TRIP_DATE" ),   
     max(a."TRIP_NUMBER" ),   
     max(a."BOOKING_NUMBER" ),   
     max(nvl(a."SPONSOR_ID",a."TRAVELLER_ID" )),
     max( EMPLOYEE_NUMBER ),
     max( FIRST_NAME ),
     max( MIDDLE_NAME ),
     max( SURNAME ),
     max(UPPER(nvl(a."SPONSOR_NAME",a."NAME" )) ),
FROM BOOKING a
JOIN SEGMENT_BOOKING b
ON a."BOOKING_NUMBER" = b."BOOKING_NUMBER" AND
    a."TRIP_NUMBER" = b."TRIP_NUMBER" AND
    a."TRIP_DATE" = b."TRIP_DATE" 
JOIN TRIP_SEGMENT c
ON b."TRIP_NUMBER" = c."TRIP_NUMBER" AND
    b."TRIP_DATE" = c."TRIP_DATE" AND
    b."SEGMENT_NUMBER" = c."SEGMENT_NUMBER"
JOIN ( SELECT d.EMPLOYEE_NUMBER AS EMPLOYEE_NUMBER,d.FIRST_NAME AS FIRST_NAME,
        d.MIDDLE_NAME AS MIDDLE_NAME ,d.SURNAME AS SURNAME
        FROM STAFF d
        UNION
       SELECT e.CONTRACT_STAFF_ID,e.FIRST_NAME,e.MIDDLE_NAME,
        e.SURNAME
        FROM CONTRACT_STAFF e 
      )
ON a."TRAVELLER_ID"  = EMPLOYEE_NUMBER

     WHERE ( ( a."STATUS" = 'CF' ) OR ( a."STATUS" = 'WL' ) ) 
 AND  a."TRIP_DATE" >= TO_DATE('2014-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS')  
AND a."TRIP_DATE" <=   TO_DATE('2015-05-30 00:00:00', 'YYYY-MM-DD HH24:MI:SS') AND  
             a."TRIP_NUMBER" like '%ABCDEFGH%' 
    GROUP BY a."BOOKING_NUMBER" ; 

【问题讨论】:

  • 我们没有您的数据来验证和复制您声称的内容。请发布一个工作测试用例。提供创建和插入语句。当您说您没有得到任何行时,您需要查看您的filter predicate。您必须过滤掉这些行。检查您的过滤条件。
  • 您真的想要名字、姓氏等不相关的最大值吗?这对我来说毫无意义......
  • 我不知道您是否可以这样做:“ON a."TRAVELLER_ID" = EMPLOYEE_NUMBER" 不确定您是否可以访问该子查询,您是否尝试过为其设置别名?
  • ... e.SURNAME FROM CONTRACT_STAFF e ) t ON a."TRAVELLER_ID" = t.EMPLOYEE_NUMBER
  • 你应该别名的是你的子查询结果,而不是你的表,正如@sqluser 刚刚展示的那样

标签: sql oracle join subquery union


【解决方案1】:

问题可能只是您的联合子查询返回的内容

您已为 STAFF 表而不是 CONTRACT_STAFF 表的列名设置别名,因此只有 STAFF 表的结果在 EMPLOYEE_NUMBER 字段中才会有非空值,因此您的联合子查询应如下所示:

SELECT d.EMPLOYEE_NUMBER AS EMPLOYEE_NUMBER,d.FIRST_NAME AS FIRST_NAME,
                d.MIDDLE_NAME AS MIDDLE_NAME ,d.SURNAME AS SURNAME
                FROM STAFF d
UNION
SELECT e.CONTRACT_STAFF_ID AS EMPLOYEE_NUMBER,
               e.FIRST_NAME AS  FIRST_NAME, e.MIDDLE_NAME AS MIDDLE_NAME,
                e.SURNAME AS SURNAME
                FROM CONTRACT_STAFF e

它可能无法解决你所有的问题,但这绝对是其中之一

【讨论】:

  • 我在应用修剪和别名子查询后得到了结果集,现在我总共得到 26 行,而没有这个子查询我得到 32 行。此结果集中缺少 6 行。不知道为什么,在第二个 Union 子句列也按照您的指定进行别名之后。
  • 知道了,在我的子查询中应用了 LEFT OUTER JOIN,现在按预期获得了 32 行,感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2016-05-23
  • 2022-12-18
  • 1970-01-01
  • 2020-11-04
  • 2013-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多