-1

MySQL在我的Crystal Reports. 我有 2 个查询,我需要full outer join在这两个查询之间申请。但正如我们所知MySQL,不支持full outer join. 所以我full outer join通过left outer join union right outer在这两个命令对象之间使用来给出。

它工作正常。但我在两个查询中都有许多共同的列。举个例子,有一列叫做Till Number. 有一种情况,如果command1.tillnumber为空,那么我需要显示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
;

请建议

4

2 回答 2

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
;
于 2013-07-01T13:12:33.503 回答
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

希望对你有帮助

于 2013-07-01T12:57:01.450 回答