大家,我需要你的帮助以下逻辑。目前我有一个有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个记录所以现在我必须找到错过的组合。
答案 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)
在查询中更改所需的列名和表名。在所有三个地方使用相同的列名称