Mysql SQL:显示缺失数据的最简单方法
我正在使用一种销售工具。我们有一个客户表,我们有一个项目表。但是,只有在定价表中有客户和该商品的记录时,才允许客户购买该产品。有时此表中缺少记录,一些客户无法订购某些项目 我有一份客户名单(CustA、CustB、CustC)和一份项目清单(Item1、Item2、Item3)。我想看看这九种可能性的定价表记录是否不存在。我可以编写一个查询,显示定价记录存在的位置,但如果我只得到七条记录,我必须手动检查每一种可能性,以查找丢失的记录Mysql SQL:显示缺失数据的最简单方法,mysql,Mysql,我正在使用一种销售工具。我们有一个客户表,我们有一个项目表。但是,只有在定价表中有客户和该商品的记录时,才允许客户购买该产品。有时此表中缺少记录,一些客户无法订购某些项目 我有一份客户名单(CustA、CustB、CustC)和一份项目清单(Item1、Item2、Item3)。我想看看这九种可能性的定价表记录是否不存在。我可以编写一个查询,显示定价记录存在的位置,但如果我只得到七条记录,我必须手动检查每一种可能性,以查找丢失的记录 Select PricingContractID, ItemK
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 |
首先构建一个查询来选择所有可能的组合,然后在链接表上运行左连接。当您有空值时,您知道链接表中没有这样的行,并且可以读取列值 链接表上没有联接的查询:
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 |
+------+------+
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
FROM
item
JOIN
customer;
+------+------+
| name | name |
+------+------+
| a1 | b4 |
| a2 | b4 |
| a3 | b4 |
| a1 | b5 |
| a2 | b5 |
| a3 | b5 |
| a1 | b6 |
| a2 | b6 |
| a3 | b6 |
+------+------+
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 |
+------+------+----------+--------------+
如果它们不存在,行中是否有
null
?不,只是没有记录。哦,废话。我知道每一步该怎么做。不知道我为什么不把它放在一起。非常感谢。