在同一个表中查找列的缺失行

时间:2013-12-19 02:51:32

标签: sql-server

我需要找到SQL Server表中存在的缺失行。我有一个包含3个项目的列表,例如,每个header_id必须始终作为具有相应product_id的单个行存在。

理想情况下,数据应如下所示:

header_id    product_id       product_group_id
    10       Main Product     7
    10       Bundle Item 1    50
    10       Bundle Item 2    50
    10       Bundle Item 3    50

但是,由于将信息添加到数据库的过程,它需要由数据输入人员单独添加每一行。结果我们看到这样的值,其中“Bundle Item 2”缺失:

header_id    product_id       product_group_id
    10       Main Product     7
    10       Bundle Item 1    50
    10       Bundle Item 3    50

以下脚本显示缺少product_id的header_id,但它仅提供“Main Product”的product_id。

SELECT header_id, product_id, product_group_id
FROM Table1
WHERE 
   (product_id = 'Main Product') 
   AND (header_id NOT IN (SELECT product_id
                          FROM table1 AS table1_1
                          WHERE (product_id = 'Bundle Item 2')))

我知道我可以使用工会对多个查询进行分组并强制执行如下所示的描述值,但如果可能的话,更愿意采用其他方式。

SELECT header_id, product_id, product_group_id, 'Bundle Item 2' as Description
FROM Table1
WHERE 
   (product_id = 'Main Product') 
   AND (header_id NOT IN (SELECT product_id
                          FROM table1 AS table1_1
                          WHERE (product_id = 'Bundle Item 2')))
UNION
SELECT header_id, product_id, product_group_id, 'Bundle Item 3' as Description
FROM Table1
WHERE 
   (product_id = 'Main Product') 
   AND (header_id NOT IN (SELECT product_id
                          FROM table1 AS table1_1
                          WHERE (product_id = 'Bundle Item 3')))

2 个答案:

答案 0 :(得分:0)

是的,你可以重新设计你的数据库。可以有这么多的数据,即什么。我知道哪个主要产品ID来自所有子产品id.and如果有什么遗漏。我不能硬编码&#39 ;捆绑项目2'。 如果每个主要产品至少有3个子产品,那么使用row_number你可以找到......什么?

Declare @t table (header_id int,product_id varchar(50),product_group_id int)
insert into @t
 select   10,       'Main Product',     7 union all
select  10,       'Bundle Item 1'  ,  50  union all
select    10,       'Bundle Item 2' ,   50 union all
select    10,       'Bundle Item 3'  ,  50 

select *,row_number()over(order by product_id)rn from @t where product_group_id<>7

答案 1 :(得分:0)

如果您确定需要这四种产品,那么您可以通过创建header_idproduct的所有可能组合来解决此问题。然后使用left outer join查找丢失的内容:

with prods as (
      select 'Main Product' as product union all
      select 'Bundle Item 1' union all
      select 'Bundle Item 2' union all
      select 'Bundle Item 3'
     ),
     allheaderprods as (
      select distinct header_id, product
      from prods cross join
           table1
     )
select ahp.*
from allheaderprocs ahp left outer join
     header h
     on ahp.header_id = h.header_id and
        ahp.product = h.product
where ahp.header_id is null;