我有2个表,一个客户,一个交易。一位客户没有任何交易。我该如何处理?当我尝试加入表格时,没有交易的客户不会出现,如下面的代码所示。
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;
我需要能够在没有交易(例如查询最小交易金额)的情况下为客户付款。
答案 0 :(得分:2)
在下面的更新查询中使用-使用右外联接代替内联接来显示所有客户,而不管客户是否下订单。
SELECT Orders.Customer_Id, Customers.AcctOpenDate,
Customers.CustomerFirstName, Customers.CustomerLastName,
Orders.TxnDate, Orders.Amount
FROM Orders
Right Outer JOIN Customers ON Orders.Customer_Id=Customers.Customer_Id;
答案 1 :(得分:0)
尝试:
SELECT Orders.Customer_Id, Customers.AcctOpenDate, Customers.CustomerFirstName, Customers.CustomerLastName, Orders.TxnDate, Orders.Amount
FROM Orders
Right OUTER JOIN Customers ON Orders.Customer_Id=Customers.Customer_Id;
答案 2 :(得分:0)
内部联接只显示两个表中都存在的记录
OUTER联接使SQL列出指定表中存在的所有记录,并为另一个表中不存在的字段显示NULL
左外联接(第一张桌子) 右外连接(第二张表) FULL OUTER JOIN(两个表的所有记录)
快速了解联接类型以及如何处理NULL,这是编写SQL脚本的90%。
以下是具有左联接的同一查询,如果没有记录,则使用ISNULL将数量列转换为0
SELECT Orders.Customer_Id, Customers.AcctOpenDate, Customers.CustomerFirstName, Customers.CustomerLastName
, Orders.TxnDate, ISNULL(Orders.Amount,0)
FROM Customers
LEFT OUTER JOIN Orders ON Orders.Customer_Id=Customers.Customer_Id;
答案 3 :(得分:0)
我强烈推荐LEFT JOIN
。这会将所有行保留在第一个表中,并将匹配的列保留在第二个表中。如果没有匹配的行,则这些列为NULL
:
SELECT c.Customer_Id, c.AcctOpenDate, c.CustomerFirstName, c.CustomerLastName,
o.TxnDate, o.Amount
FROM Customers c LEFT JOIN
Orders o
ON o.Customer_Id = c.Customer_Id;
尽管您可以使用RIGHT JOIN
,但我从未使用过RIGHT JOIN
,因为我发现它们更难以理解。 “保留我读取的第一个表中的所有行”的逻辑相对简单。 “在读取最后一张表之前我不知道要保留哪些行”的逻辑很难理解。
还请注意,我包括了表别名,并将CustomerId
更改为来自customers
的位置,即您保留所有行的表。
答案 4 :(得分:0)
使用 CASE 会将 "null" 替换为 0,然后您可以对这些值求和。这将计算没有交易的客户。
SELECT c.Name,
SUM(CASE WHEN t.ID IS NULL THEN 0 ELSE 1 END) as TransactionsPerCustomer
FROM Customers c
LEFT JOIN Transactions t
ON c.Name = t.customerID
group by c.Name