【问题标题】:SQL Logic or Query to find what is missingSQL 逻辑或查询以查找缺少的内容
【发布时间】:2016-09-28 18:05:10
【问题描述】:

大家好,我需要您对以下逻辑的帮助。目前我有一个包含 300 条记录的表,这些记录是相关的,但在这个新表中,我有称为国家/地区、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 条记录,所以现在我必须找出遗漏的组合。

【问题讨论】:

  • 让我举个例子
  • 感谢 Flavor 但仍未回答我的情况,因为我的问题上的表 a 和表 b 的列和记录数量不同。
  • 您需要在不同国家和类别之间进行笛卡尔连接,然后与交叉连接相对容易,但我没有关注 POS 是什么以及它与您想要的结果的关系。另外,您真的应该向我们展示您想要的结果是什么!
  • 还有什么 RDBM? sql-sever、mysql、oracle?

标签: sql sql-server records


【解决方案1】:

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

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 并在派生的 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')

【讨论】:

    【解决方案2】:


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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多