简体   繁体   English

将2个内部连接结果合并为一个结果

[英]Join 2 inner join result into one result

Everyone I have a problem. 大家我都有问题。 I have two query which is running fine separate. 我有两个独立运行的查询。 But I want to make into one query I have tried, but those are not work. 但是我想将我尝试过的查询合并为一个查询,但是这些查询不起作用。 I need to join two output. 我需要加入两个输出。

First Query: 第一个查询:

SELECT q_internal_table.q_part_id, 
   q_external_table.q_external_id, 
   q_external_table.q_external_approve, 
   q_external_table.q_order_id, 
   q_internal_table.q_internal_id, 
   q_internal_table.q_internal_approve 
   FROM   (SELECT parts.id                  AS q_part_id, 
           parts.order_id            AS q_order_id, 
           external_reports.id       AS q_external_id, 
           external_reports.approved AS q_external_approve 
    FROM   parts 
           INNER JOIN external_reports 
                   ON( parts.id = external_reports.part_id )) 
   q_external_table 
   INNER JOIN (SELECT parts.id                  AS q_part_id, 
                      internal_reports.id       AS q_internal_id, 
                      internal_reports.approved AS q_internal_approve 
               FROM   parts 
                      INNER JOIN internal_reports 
                              ON( parts.id = internal_reports.part_id )) 
          q_internal_table 
           ON( q_external_table.q_part_id = q_internal_table.q_part_id ) 
   WHERE  ( q_external_table.q_external_approve = 'Y' 
      OR q_internal_table.q_internal_approve = 'Y' ) 

Second Query: 第二个查询:

SELECT q_five_internal_table.q_five_part_id,
   q_five_internal_table.q_five_internal_id, 
   q_five_internal_table.q_five_internal_approve,
   q_five_external_table.q_five_external_id, 
   q_five_external_table.q_five_external_approve, 
   q_five_external_table.q_five_order_id
   FROM   (SELECT parts.id                  AS q_five_part_id, 
           parts.order_id            AS q_five_order_id, 
           five_way_external_reports.id       AS q_five_external_id, 
           five_way_external_reports.approved AS q_five_external_approve 
    FROM   parts 
           INNER JOIN five_way_external_reports 
                   ON( parts.id = five_way_external_reports.part_id )) 
   q_five_external_table 
   INNER JOIN (SELECT parts.id                  AS q_five_part_id, 
                      five_way_internal_reports.id       AS q_five_internal_id, 
                      five_way_internal_reports.approved AS q_five_internal_approve 
               FROM   parts 
                      INNER JOIN five_way_internal_reports 
                              ON( parts.id = five_way_internal_reports.part_id )) 
          q_five_internal_table 
           ON( q_five_external_table.q_five_part_id = q_five_internal_table.q_five_part_id ) 
  WHERE  ( q_five_external_table.q_five_external_approve = 'Y' 
      OR q_five_internal_table.q_five_internal_approve = 'Y' ) 

First Query Result: 第一个查询结果: 在此处输入图片说明

Second Query Result: 第二查询结果: 在此处输入图片说明

I have tried this query:- 我已经尝试过此查询:

SELECT q_internal_external_table.*, 
   q_five_internal_external_table.* 
FROM   (SELECT q_internal_table.q_part_id, 
           q_external_table.q_external_id, 
           q_external_table.q_external_approve, 
           q_external_table.q_order_id, 
           q_internal_table.q_internal_id, 
           q_internal_table.q_internal_approve 
    FROM  (SELECT parts.id                  AS q_part_id, 
                  parts.order_id            AS q_order_id, 
                  external_reports.id       AS q_external_id, 
                  external_reports.approved AS q_external_approve 
           FROM   parts 
                  INNER JOIN external_reports 
                          ON( parts.id = external_reports.part_id )) 
          q_external_table 
          INNER JOIN (SELECT parts.id                  AS q_part_id, 
                             internal_reports.id       AS q_internal_id, 
                             internal_reports.approved AS q_internal_approve 
                      FROM   parts 
                             INNER JOIN internal_reports 
        ON( parts.id = internal_reports.part_id )) 
        q_internal_table 
       ON( q_external_table.q_part_id = q_internal_table.q_part_id ) 
       WHERE  ( q_external_table.q_external_approve = 'Y' 
       OR q_internal_table.q_internal_approve = 'Y' )) 
       q_internal_external_table 
       INNER JOIN (SELECT q_five_internal_table.q_five_part_id, 
       q_five_internal_table.q_five_internal_id, 
       q_five_internal_table.q_five_internal_approve, 
       q_five_external_table.q_five_order_id, 
       q_five_external_table.q_five_external_id, 
       q_five_external_table.q_five_external_approve 
       FROM   (SELECT parts.id                           AS q_five_part_id, 
       parts.order_id                     AS 
       q_five_order_id 
       , 
      five_way_external_reports.id       AS 
       q_five_external_id, 
       five_way_external_reports.approved AS 
       q_five_external_approve 
       FROM   parts 
       INNER JOIN five_way_external_reports 
       ON( parts.id = five_way_external_reports.part_id )) 
       q_five_external_table 
       INNER JOIN (SELECT parts.id  AS     q_five_part_id, 
       five_way_internal_reports.id       AS 
       q_five_internal_id, 
       five_way_internal_reports.approved AS 
       q_five_internal_approve 
       FROM   parts 
       INNER JOIN five_way_internal_reports 
       ON( parts.id = five_way_internal_reports.part_id )) 
       q_five_internal_table 
       ON ( q_five_external_table.q_five_part_id = 
       q_five_internal_table.q_five_part_id ) 
       WHERE  ( q_five_external_table.q_five_external_approve = 'Y' 
       OR q_five_internal_table.q_five_internal_approve = 'Y' )) 
       q_five_internal_external_table 
       ON ( q_internal_external_table.q_part_id = 
       q_five_internal_external_table.q_five_part_id ) 

QUERY Result:- 查询结果:- 在此处输入图片说明 In this query there are three result. 在此查询中有三个结果。 But I want the 7 result in as in the first query result. 但是我希望第一个查询结果中有7个结果。 The three answer is already in the first query result. 这三个答案已经在第一个查询结果中。 I need rest 4 too. 我也需要休息4 I think the problem is in ON q_internal_external_table.q_part_id = q_five_internal_external_table.q_five_part_id . 我认为问题出在ON q_internal_external_table.q_part_id = q_five_internal_external_table.q_five_part_id But don't know how to solve it. 但是不知道如何解决。

Please help me. 请帮我。 Thanks in advance. 提前致谢。

What you need is UNION . 您需要的是UNION

Both queries need to have the same amount columns and types. 两个查询都需要具有相同数量的列和类型。 In your case, you need to change the order of the columns selected in order to make the UNION . 在您的情况下,您需要更改所选列的顺序以使成为UNION

Should be something like this: 应该是这样的:

SELECT q_internal_table.q_part_id, 
   q_external_table.q_external_id, 
   q_external_table.q_external_approve, 
   q_external_table.q_order_id, 
   q_internal_table.q_internal_id, 
   q_internal_table.q_internal_approve 
   FROM   (SELECT parts.id AS q_part_id, 
           parts.order_id AS q_order_id, 
           external_reports.id AS q_external_id, 
           external_reports.approved AS q_external_approve 
    FROM parts 
           INNER JOIN external_reports 
                   ON( parts.id = external_reports.part_id )) 
   q_external_table 
   INNER JOIN (SELECT parts.id AS q_part_id, 
                      internal_reports.id AS q_internal_id, 
                      internal_reports.approved AS q_internal_approve 
               FROM   parts 
                      INNER JOIN internal_reports 
                              ON( parts.id = internal_reports.part_id )) 
          q_internal_table 
           ON( q_external_table.q_part_id = q_internal_table.q_part_id ) 
   WHERE  ( q_external_table.q_external_approve = 'Y' 
      OR q_internal_table.q_internal_approve = 'Y' )

UNION ALL 

SELECT q_five_internal_table.q_five_part_id,
      q_five_external_table.q_five_external_id,
      q_five_external_table.q_five_external_approve, 
      q_five_external_table.q_five_order_id,
   q_five_internal_table.q_five_internal_id, 
   q_five_internal_table.q_five_internal_approve   
   FROM   (SELECT parts.id AS q_five_part_id, 
           parts.order_id AS q_five_order_id, 
           five_way_external_reports.id AS q_five_external_id, 
           five_way_external_reports.approved AS q_five_external_approve 
    FROM   parts 
           INNER JOIN five_way_external_reports 
                   ON( parts.id = five_way_external_reports.part_id )) 
   q_five_external_table 
   INNER JOIN (SELECT parts.id AS q_five_part_id, 
                      five_way_internal_reports.id AS q_five_internal_id, 
                      five_way_internal_reports.approved AS q_five_internal_approve 
               FROM parts 
                      INNER JOIN five_way_internal_reports 
                              ON( parts.id = five_way_internal_reports.part_id )) 
          q_five_internal_table 
           ON( q_five_external_table.q_five_part_id = q_five_internal_table.q_five_part_id ) 
  WHERE  ( q_five_external_table.q_five_external_approve = 'Y' 
      OR q_five_internal_table.q_five_internal_approve = 'Y' ) 

Notice I've changed the order of the columns in the second query to match the type of the first. 注意,我已经更改了第二个查询中列的顺序以匹配第一个查询的类型。

Your updated query seems to be correct (semantically), if we assume that the end objective of your query is to find a parts.id in the following tables: external_reports, internal_reports, five_way_external_reports, five_way_internal_reports 如果我们假设查询的最终目标是在下表中找到parts.id,则更新后的查询似乎正确(理论上):external_reports,internal_reports,five_way_external_reports,five_way_internal_reports

Union is to be used when combining the rows of query 1 and query 2. 合并查询1和查询2的行时将使用并集。

However, if you are trying to find matching columns (join clause), then the JOIN and not UNION is to be used. 但是,如果尝试查找匹配的列(join子句),则将使用JOIN而不是UNION。

Also, please try EXPLAIN and EXPLAIN EXTENDED prefix to your queries to understand the query plan. 另外,请尝试在查询中使用EXPLAIN和EXPLAIN EXTENDED前缀以了解查询计划。

Special Thanks to @ dnoeth. 特别感谢@ dnoeth。 Great man. 好人。

The modified SQL is, 修改后的SQL是

select q_internal_external_table.*,q_five_internal_external_table.* from         
(select q_internal_table.q_part_id, 
q_external_table.q_external_id,q_external_table.q_external_approve, 
q_external_table.q_order_id,q_internal_table.q_internal_id, 
q_internal_table.q_internal_approve from(SELECT parts.id as 
q_part_id,parts.order_id as q_order_id,external_reports.id as 
q_external_id,external_reports.approved as q_external_approve from parts 
LEFT join external_reports on(parts.id=external_reports.part_id)) 
q_external_table LEFT join (SELECT parts.id as q_part_id,internal_reports.id 
as q_internal_id,internal_reports.approved as q_internal_approve from parts 
LEFT join internal_reports on(parts.id=internal_reports.part_id)) 
q_internal_table on(q_external_table.q_part_id=q_internal_table.q_part_id) 
where (q_external_table.q_external_approve='Y' or 
q_internal_table.q_internal_approve='Y')) q_internal_external_table LEFT 
join (select q_five_internal_table.q_five_part_id, 
q_five_internal_table.q_five_internal_id, 
q_five_internal_table.q_five_internal_approve, 
q_five_external_table.q_five_order_id, 
q_five_external_table.q_five_external_id, 
q_five_external_table.q_five_external_approve from (SELECT parts.id as 
q_five_part_id,parts.order_id as q_five_order_id, 
five_way_external_reports.id as q_five_external_id, 
five_way_external_reports.approved as q_five_external_approve from parts 
LEFT join five_way_external_reports on(parts.id= 
five_way_external_reports.part_id)) q_five_external_table LEFT join (SELECT 
parts.id as q_five_part_id,five_way_internal_reports.id as 
q_five_internal_id,five_way_internal_reports.approved as 
q_five_internal_approve from parts LEFT join five_way_internal_reports 
on(parts.id=five_way_internal_reports.part_id)) q_five_internal_table on 
(q_five_external_table.q_five_part_id=q_five_internal_table.q_five_part_id) 
where (q_five_external_table.q_five_external_approve='Y' or 
q_five_internal_table.q_five_internal_approve='Y')) 
q_five_internal_external_table on (q_internal_external_table.q_part_id 
=q_five_internal_external_table.q_five_part_id)

The answer: (which I want) 答案:(我想要) 在此处输入图片说明

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

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