我查了很多类似的问题,但没有人适用于Firebird,我想。如何选择连接的行,即使没有匹配?
我有两个表;一个存储客户信息,第二个存储库存活动(其中还包括订单)。我想提取所有客户以及他们订单的数量。但无论我如何加入订单表,我最终只得到至少有一个订单的客户。这意味着在库存活动表中没有匹配的客户将不会显示在结果集中。
这是我运行的查询;
SELECT
C.NAME, C.GROUPNAME, C.EMAIL,
COALESCE(COUNT(DISTINCT S.ORDERNO), '0') AS TOTALORDERS,
COALESCE(SUM(S.AMOUNT), '0') as TOTALREVENUE
FROM CUSTOMERS C
LEFT OUTER JOIN STOCK_ACTIVITY S ON C.ID = S.CUSTOMERID
WHERE C.GROUPNAME = 'B'
AND (S.TYPE = 'RECEIPT' OR S.TYPE = 'INVOICE')
GROUP BY C.NAME, C.GROUPNAME, C.EMAIL
没有连接,我得到570行(客户),它是正确的结果集。当我加入订单表以获取这些客户的总订单量时;我只得到379个结果;哪些是至少有一个订单。这意味着没有订单的客户将不会退货。你可能已经猜到了;我想让零活动的客户返回“0”作为订单金额和收入。
谢谢;这已经完成了这项工作。虽然两种不同的选择产生了不同的结果。有趣的是,将过滤器连接到连接中产生比where子句少2行的内容。 – Turab
这可能意味着'STOCK_ACTIVITY'中有2条记录,'TYPE'真*是*'NULL'。我想我应该指出,如果使用选项1,则需要将“真实记录与某些”NULL“值区分开”形成“生成的”NULL记录“。在大多数敏感的数据模型中,您可以通过检查右表PK值是否为NULL来做到这一点。或者肯定你可以测试连接键的右表值是否为NULL(因为an = join不会匹配这样的记录) –