SQL:显示缺失数据的最简单方法

时间:2018-06-19 16:44:27

标签: mysql

我正在使用销售工具。我们有一个客户表,还有一个项目表。但是,只有在定价表中有该客户和该商品的记录时,该客户才被允许购买产品。有时此表中缺少记录,有些客户无法订购某些物品。

我有一个客户列表(CustA,CustB,CustC)和一个项目列表(Item1,Item2,Item3)。我想看看这九种可能性是否不存在定价表记录。我可以编写一个查询,向我显示定价记录的位置,但是如果我只得到7条记录,则必须手动检查每种可能性,以查找缺失的记录。

Select PricingContractID, ItemKey 
from PricingContracts 
where PricingContractID in (CustA, CustB, CustC) 
   and ItemKey in (Item1, Item2, Item3)

结果:

| CustA | Item1 |   
| CustB | Item1 |   
| CustA | Item3 |   
| CustA | Item2 |   
| CustB | Item3 |  
| CustC | Item2 |  
| CustC | Item3 |

我想查询将显示哪些记录不存在的查询。

| CustB | Item2 |  
| CustC | Item1 |  

尤其是,我希望将其放置在一个数组中,其中一个轴上的项目编号,另一个轴上的客户编号,并有某种指示表明存在记录。

|   •   | Item1 | Item2 | Item3 |  
| CustA |   Y   |   Y   |   Y   |   
| CustB |   Y   |       |   Y   |   
| CustC |       |   Y   |   Y   |   

1 个答案:

答案 0 :(得分:1)

首先构建查询以选择所有可能的组合,然后在链接表上运行LEFT JOIN。当您拥有NULL值时,您就会知道链接表中没有这样的行,并且可以读取列值。

链接表上没有JOIN的查询:

SELECT
    item.name,
    customer.name
FROM
    item
JOIN
    customer;

+------+------+
| name | name |
+------+------+
| a1   | b4   |
| a2   | b4   |
| a3   | b4   |
| a1   | b5   |
| a2   | b5   |
| a3   | b5   |
| a1   | b6   |
| a2   | b6   |
| a3   | b6   |
+------+------+

然后在链接表上添加JOIN:

SELECT
    item.name,
    customer.name,
    link.itemName,
    link.customerName
FROM
    item
JOIN
    customer
LEFT JOIN
    link ON item.name = link.itemName AND
            customer.name = link.customerName;

+------+------+----------+--------------+
| name | name | itemName | customerName |
+------+------+----------+--------------+
| a1   | b5   | a1       | b5           |
| a2   | b5   | a2       | b5           |
| a2   | b6   | a2       | b6           |
| a3   | b4   | a3       | b4           |
| a1   | b4   | NULL     | NULL         |
| a2   | b4   | NULL     | NULL         |
| a3   | b5   | NULL     | NULL         |
| a1   | b6   | NULL     | NULL         |
| a3   | b6   | NULL     | NULL         |
+------+------+----------+--------------+

然后只需过滤所需的行:

SELECT
    item.name,
    customer.name,
    link.itemName,
    link.customerName
FROM
    item
JOIN
    customer
LEFT JOIN
    link ON item.name = link.itemName AND
            customer.name = link.customerName
WHERE
    link.itemName IS NULL;

+------+------+----------+--------------+
| name | name | itemName | customerName |
+------+------+----------+--------------+
| a1   | b4   | NULL     | NULL         |
| a2   | b4   | NULL     | NULL         |
| a3   | b5   | NULL     | NULL         |
| a1   | b6   | NULL     | NULL         |
| a3   | b6   | NULL     | NULL         |
+------+------+----------+--------------+