簡體   English   中英

將2個內部連接結果合並為一個結果

[英]Join 2 inner join result into one result

大家我都有問題。 我有兩個獨立運行的查詢。 但是我想將我嘗試過的查詢合並為一個查詢,但是這些查詢不起作用。 我需要加入兩個輸出。

第一個查詢:

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' ) 

第二個查詢:

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' ) 

第一個查詢結果: 在此處輸入圖片說明

第二查詢結果: 在此處輸入圖片說明

我已經嘗試過此查詢:

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 ) 

查詢結果:- 在此處輸入圖片說明 在此查詢中有三個結果。 但是我希望第一個查詢結果中有7個結果。 這三個答案已經在第一個查詢結果中。 我也需要休息4 我認為問題出在ON q_internal_external_table.q_part_id = q_five_internal_external_table.q_five_part_id 但是不知道如何解決。

請幫我。 提前致謝。

您需要的是UNION

兩個查詢都需要具有相同數量的列和類型。 在您的情況下,您需要更改所選列的順序以使成為UNION

應該是這樣的:

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' ) 

注意,我已經更改了第二個查詢中列的順序以匹配第一個查詢的類型。

如果我們假設查詢的最終目標是在下表中找到parts.id,則更新后的查詢似乎正確(理論上):external_reports,internal_reports,five_way_external_reports,five_way_internal_reports

合並查詢1和查詢2的行時將使用並集。

但是,如果嘗試查找匹配的列(join子句),則將使用JOIN而不是UNION。

另外,請嘗試在查詢中使用EXPLAIN和EXPLAIN EXTENDED前綴以了解查詢計划。

特別感謝@ dnoeth。 好人。

修改后的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)

答案:(我想要) 在此處輸入圖片說明

暫無
暫無

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

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