SQL 查找缺失内容的逻辑或查询

SQL Logic or Query to find what is missing

大家好,我需要您对以下逻辑的帮助。目前我有一个 table 有 300 条记录,它们是相关的,但是在这个新的 tables 上我有称为国家/地区的列,POS 所以对于国家 + PO 的每个组合我应该有 1 条记录table答.

但情况是,当我检查最后一个 table 时,有人只将 table A 的一些记录插入到 table b 中,现在我必须找到什么是缺少组合。

你能指导我应该使用的逻辑吗,有任何问题请告诉我。

Example

Table A name Categories
Milk
Hot Sauces
Meat

Table B
Category    POS    Country
Milk        DF      Mexico
Meat        DF      Mexico
Hot Sauces  DF      Mexico
Milk        CC      Canada

您可以看到加拿大仍然缺少 2 个类别,但是这个 table 包含所有美洲国家,所以假设我有 20 个国家/地区。所以 20 乘以 300 个类别,我应该有 6000 条或更多不同的记录,因为每个国家/地区的 POS 数量不同,对吧,但是有人只插入了 3600 条记录,所以现在我必须找到遗漏的组合。


嗨,
您可以使用以下逻辑来获取缺失数据,

SELECT column_name FROM tableA WHERE column_name NOT IN 
(SELECT column_name FROM tableB)

更改查询中所需的列名称和 table 名称。在所有三个地方使用相同的列名

如果您没有国家/地区 table,您可以通过从 TableB 中选择 DISTINCT 国家/地区来导出国家/地区。然后将其与类别交叉连接以在国家和类别之间进行笛卡尔连接(所有可能的组合)。

SELECT countries.country, c.Category
FROM
    (SELECT DISTINCT Country
    FROM
       @TableB) as countries
    CROSS JOIN @Categories c
    LEFT JOIN @TableB b
    ON countries.Country = b.Country
    AND c.Category = b.Cateogry
WHERE
    b.Cateogry IS NULL

如果您确实需要 POS 与国家/地区和类别的所有可能组合。在这种情况下,POS 听起来更像是商店而不是销售点,但概念相同。如果您没有 POS table,只需派生一个 POS,然后将其与国家和类别的交叉连接交叉连接即可。

SELECT
    countries.country, c.Category, pos.POS
FROM
    (SELECT DISTINCT Country
    FROM
       @TableB) as countries
    CROSS JOIN @Categories c
    CROSS JOIN (SELECT DISTINCT POS
       FROM
          @TableB) as pos
    LEFT JOIN @TableB b
    ON countries.Country = b.Country
    AND c.Category = b.Cateogry
    AND pos.POS = b.POS
WHERE
    b.Cateogry IS NULL

但我猜想并不是每家商店都在每个国家/地区,因此您可能希望将 POS 组合限制为在特定国家/地区可用的 POS。同样,如果您没有 table,您可以派生 table,这次包括国家/地区,并在派生国家/地区 table 和它之间进行内部连接。

SELECT
    countries.country, c.Category, pos.POS
FROM
    (SELECT DISTINCT Country
    FROM
       @TableB) as countries
    CROSS JOIN @Categories c
    INNER JOIN (SELECT DISTINCT Country, POS
       FROM
          @TableB) as pos
    ON countries.Country = pos.Country
    LEFT JOIN @TableB b
    ON countries.Country = b.Country
    AND c.Category = b.Cateogry
    AND pos.POS = b.POS
WHERE
    b.Cateogry IS NULL

使用的测试数据:

DECLARE @Categories AS TABLE (Category VARCHAR(25))
DECLARE @TableB AS TABLE (Cateogry VARCHAR(25),POS CHAR(2), Country VARCHAR(25))
INSERT INTO @Categories VALUES ('Milk'),('Hot Sauces'),('Meat')
INSERT INTO @TableB VALUES ('Milk','DF','Mexico'),('Meat','DF','Mexico'),('Hot Sauces','DF','Mexico'),('Milk','CC','Canada'),('Milk','XX','Canada')