我正在使用销售工具。我们有一个客户表,还有一个项目表。但是,只有在定价表中有该客户和该商品的记录时,该客户才被允许购买产品。有时此表中缺少记录,有些客户无法订购某些物品。
我有一个客户列表(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 |
答案 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 |
+------+------+----------+--------------+