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')
大家好,我需要您对以下逻辑的帮助。目前我有一个 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')