我有两个表-一个客户,一个事务。一个客户没有任何事务。我该如何处理这个问题?当我尝试联接我的表时,没有事务的客户没有显示,如下面的代码所示。
SELECT Orders.Customer_Id, Customers.AcctOpenDate, Customers.CustomerFirstName, Customers.CustomerLastName, Orders.TxnDate, Orders.Amount
FROM Orders
INNER JOIN Customers ON Orders.Customer_Id=Customers.Customer_Id;
我需要能够说明客户没有交易,如查询最低交易金额。
6条答案
按热度按时间gjmwrych1#
使用下面更新的查询-使用右外连接而不是内连接来显示所有客户,而不管客户是否已下订单。
uplii1fm2#
内部连接仅显示两个表中都存在的那些记录
OUTER连接使SQL列出指定表中存在的所有记录,并为另一个表中不存在的字段显示NULL
左外联接(第一个表)右外联接(第二个表)完整外联接(两个表的所有记录)
掌握连接类型和如何处理NULL,这是编写SQL脚本的90%。
下面是使用左连接的同一查询,如果amount列没有记录,则使用ISNULL将其转换为0
dbf7pr2w3#
试试这个:
ru9i0ody4#
我强烈推荐使用
LEFT JOIN
,这会保留第一个表中的所有行,沿着第二个表中的匹配列,如果没有匹配行,则这些列是NULL
:虽然你可以使用
RIGHT JOIN
,但我从来不用RIGHT JOIN
,因为我发现它们很难遵循。“保留我读取的第一个表中的所有行”的逻辑相对简单。“在读取最后一个表之前,我不知道我保留了哪些行”的逻辑更难遵循。还要注意,我包含了表别名,并将
CustomerId
更改为来自customers
--保存所有行的表。ie3xauqp5#
使用CASE将用0替换“null”,然后您可以对值求和。这将计算没有交易的客户。
efzxgjgh6#
SELECT c.Name,SUM(CASE WHEN t.ID IS NULL THEN 0 ELSE 1 END)作为交易编号FROM客户c LEFT JOIN交易t ON c.Name = t.客户ID按c.Name分组