全外加入帮助请

时间:2013-07-01 12:49:08

标签: mysql

我在MySQL中使用Crystal Reports。 我有2个查询,我需要在这两个之间应用full outer join。但据我们所知,MySQL将不支持full outer join。所以我在这两个命令对象之间使用full outer join给了left outer join union right outer

它工作正常。但我在两个查询中都有许多常用列。举一个例子,有一列名为Till Number。有一种情况是,如果command1.tillnumber为null,那么我需要显示command2.tillnumber,但现在我们正在应用完全外连接。我的意思是我们只有一个查询。所以它提供了所有数据。那么如果查询1数据不为空,我怎么能得到它。

完全外部联接的查询如下:

SELECT q1.pos_no
, q1.pos_name
, q1.start_trans_id
, q1.end_trans_id
, q1.EodDeposit
, q2.net
FROM ( <<<QUERY:1>>> ) AS q1
LEFT OUTER JOIN
( <<<QUERY:2>>> ) AS q2
ON q2.pos_no = q1.pos_no
UNION
SELECT q2.pos_no
, q2.pos_name
, q1.start_trans_id
, q1.end_trans_id
, q1.EodDeposit
, q 2. net
FROM ( <<<QUERY:1>>> ) AS q 1
RIGHT OUTER JOIN
( <<<QUERY:2>>> ) AS q2
ON q1. pos_no = q2. pos_no
;

请建议

2 个答案:

答案 0 :(得分:0)

您可以通过将结果集设为table并以进一步在列上应用条件的方式来实现此目的

SELECT q.* FROM (
SELECT q1.pos_no
, q1.pos_name
, q1.start_trans_id
, q1.end_trans_id
, q1.EodDeposit
, q2.net
FROM ( <<<QUERY:1>>> ) AS q1
LEFT OUTER JOIN
( <<<QUERY:2>>> ) AS q2
ON q2.pos_no = q1.pos_no
UNION
SELECT q2.pos_no
, q2.pos_name
, q1.start_trans_id
, q1.end_trans_id
, q1.EodDeposit
, q 2. net
FROM ( <<<QUERY:1>>> ) AS q 1
RIGHT OUTER JOIN
( <<<QUERY:2>>> ) AS q2
ON q1. pos_no = q2. pos_no
) q WHERE q.pos_no !="" AND q.start_trans_id !="" // same way add the conditions

希望它可以帮到你

答案 1 :(得分:0)

使用IFNULL

SELECT IFNULL(q1_pos_no, q2_pos_no)
, IFNULL(q1_pos_name, q2_pos_name)
, IFNULL(q1_start_trans_id, q2_start_trans_id)
, IFNULL(q1_end_trans_id, q2_end_trans_id)
, IFNULL(q1_EodDeposit, q2_EodDeposit)
, IFNULL(q1_net, q2_net)
FROM 
(
    SELECT q1.pos_no AS q1_pos_no
    , q1.pos_name AS q1_pos_name
    , q1.start_trans_id AS q1_start_trans_id
    , q1.end_trans_id AS q1_end_trans_id
    , q1.EodDeposit AS q1_EodDeposit
    , q1.net AS q1_net,
    , q2.pos_no AS q2_pos_no
    , q2.pos_name AS q2_pos_name
    , q2.start_trans_id AS q2_start_trans_id
    , q2.end_trans_id AS q2_end_trans_id
    , q2.EodDeposit AS q2_EodDeposit
    , q2.net AS q2_net
    FROM ( <<<QUERY:1>>> ) AS q1
    LEFT OUTER JOIN
    ( <<<QUERY:2>>> ) AS q2
    ON q2.pos_no = q1.pos_no
    UNION
    SELECT q1.pos_no AS q1_pos_no
    , q1.pos_name AS q1_pos_name
    , q1.start_trans_id AS q1_start_trans_id
    , q1.end_trans_id AS q1_end_trans_id
    , q1.EodDeposit AS q1_EodDeposit
    , q1.net AS q1_net,
    , q2.pos_no AS q2_pos_no
    , q2.pos_name AS q2_pos_name
    , q2.start_trans_id AS q2_start_trans_id
    , q2.end_trans_id AS q2_end_trans_id
    , q2.EodDeposit AS q2_EodDeposit
    , q2.net AS q2_net
    FROM ( <<<QUERY:1>>> ) AS q 1
    RIGHT OUTER JOIN
    ( <<<QUERY:2>>> ) AS q2
    ON q1. pos_no = q2. pos_no
) Sub1
;