SQL Logic或Query查找缺少的内容

时间:2016-09-28 18:05:11

标签: sql sql-server records

大家,我需要你的帮助以下逻辑。目前我有一个有300条记录的表,这些记录是相关的但是在这个新表上我有列称为country,POS所以对于每个国家+ PO的组合,我应该有1个表A的记录。

但情况是,当我检查最后一张表时,有人只将表A的一些记录插入表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个类别,但是这个表有所有美洲国家,所以假设我有20个国家。所以20个多个300个类别我应该有6000个不同的记录或更多,因为每个国家有不同数量的POS,对,但是只有插入的人说3600个记录所以现在我必须找到错过的组合。

2 个答案:

答案 0 :(得分:1)

如果您没有国家/地区表,则可以从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表,只需获得一个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组合中。如果您这次没有包含Country,并且在派生国家/地区表之间进行内部联接,您可以再次派生该表。

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')

答案 1 :(得分:0)

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

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

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