2016-11-22 59 views
2

之后替换NULL列我正在使用UNION组合两个select语句的结果。在一个声明中,我找到senderidentity,在另一个声明中我找到recipientidentity。我遇到的问题是,我的行数始终是“应该”的两倍,因为收件人结果始终会有一个“空白”sender,发件人结果的空白将会是“空白”recipient。我怎样才能重组这个结果为每个交易都返回一行,同时填入senderrecipient在SQL UNION

(
    SELECT s.id, s.sender_id, '' AS sender, NOW() AS sender_create_date, s.recipient_id, 
    MAX(c.identity) AS recipient, MAX(c.create_date) AS recipient_create_date 
    FROM db.sales s 
    LEFT JOIN db.customers c ON c.participant_id = s.recipient_id 
    WHERE sender_id = $1 
    OR recipient_id = $1 
    GROUP BY s.id 
) 
UNION 
(
    SELECT s.id, MAX(c.identity) AS sender, MAX(c.create_date) AS sender_create_date, s.recipient_id, 
    '' AS recipient, NOW() AS recipient_create_date 
    FROM db.sales s 
    LEFT JOIN db.customers c ON c.participant_id = s.recipient_id 
    WHERE sender_id = $1 
    OR recipient_id = $1 
    GROUP BY s.id 
) 

这里是我的一个交易目前的结果的一个例子:

id | sender | sender_create_date | recipient | recipient_create_date 
1 | bob |  11/1/2016  |   | 11/22/2016 
1 |  |  11/22/2016  | jill | 11/5/2016 

我所瞄准的是:

id | sender | sender_create_date | recipient | recipient_create_date 
1 | bob |  11/1/2016  | jill | 11/5/2016 
+1

试着描述你希望查询实际执行。 –

+1

为什么一个工会呢? (联盟是导致多行的原因,似乎需要2次加入客户,一次发件人,一次收件人(请注意,您可能会获得4条记录,UNION正在清除2.) – xQbert

+0

@xQbert不幸的是,'c.participant_id'不是唯一的''db.customers'可以包含多行'participant_id',我想为'participant_id'获取最近的'c.create_date'。 – MattDionis

回答

1

原来我一直在瞄准可以完成有两个连接:

SELECT s.id, MAX(cs.identity) AS sender, MAX(cs.create_date) AS sender_create_date, MAX(cr.identity) AS recipient, MAX(cr.create_date) AS recipient_create_date 
FROM db.sales s 
LEFT JOIN db.customers cr ON cr.participant_id = s.recipient_id 
LEFT JOIN db.customers cs ON cs.participant_id = s.sender_id 
WHERE sender_id = $1 
OR recipient_id = $1 
GROUP BY s.id;