比较两个表以查找丢失的行

时间:2017-08-01 14:16:17

标签: sql sql-server

我有两张桌子 - 产品表显示员工和他们被允许出售的产品。 Inv表包含发票编号以及员工姓名和产品。 每个有资格查看的员工必须连接到该发票。 我想比较这两个表,以找出缺少合格员工的inv行。 我从下面的比较查询中得到的结果是可以的,除了它不包括prod 11和employee b的发票104。 正确的答案应该是

101 c 11
102 d 12
104 b 11
104 c 11

提前感谢您的帮助/

create table #prod
(
nameID int
, name nvarchar(255)
, prod nvarchar(255)
)

insert into #prod (nameID, name, prod)
values(1, 'a', 11)
insert into #prod (nameID, name, prod)
values(2, 'b', 11 )
insert into #prod (nameID, name, prod)
values(3, 'c', 11)
insert into #prod (nameID, name, prod)
values(2, 'b', 12)
insert into #prod (nameID, name, prod)
values(4, 'd', 12)
insert into #prod (nameID, name, prod)
values(3, 'c', 13)
insert into #prod (nameID, name, prod)
values(4, 'd', 13)

create table #inv
(
inv_id int
, name nvarchar(255)
, prod nvarchar(255)
)

insert into #inv (inv_id, name, prod)
values(101, 'a', 11)
insert into #inv (inv_id, name, prod)
values(101, 'b', 11 )
insert into #inv (inv_id, name, prod)
values(102, 'b', 12)
insert into #inv (inv_id, name, prod)
values(102, 'c', 12)
insert into #inv (inv_id, name, prod)
values(103, 'c', 13)
insert into #inv (inv_id, name, prod)
values(104, 'a', 11)

3 个答案:

答案 0 :(得分:1)

SELECT DISTINCT
  i.inv_id, p.name, p.prod
FROM #inv i
JOIN #prod p
  ON p.prod = i.prod
LEFT JOIN #inv v
  ON v.inv_id = i.inv_id AND
     v.name = p.name AND
     v.prod = p.prod
WHERE v.inv_id IS NULL;

答案 1 :(得分:0)

select distinct cs.*
from 
(
select inv.inv_id, prod.[name], prod.prod
from #inv inv , #prod prod
where
    inv.name <> prod.name and
    inv.prod = prod.prod
) cs
left join 
(
select inv.inv_id, inv.name, inv.prod
from #inv inv,#prod prod
where
    inv.name = prod.name and
    inv.prod = prod.prod
) b on cs.inv_id = b.inv_id and cs.name = b.name and cs.prod = b.prod
where
    b.inv_id is null
order by 
    1,2,3

答案 2 :(得分:0)

如果您在一张桌子上有类似外键的东西,也许这样的事可以帮到你。

SELECT ID, Name
FROM   table1
WHERE  ID NOT IN (SELECT fID FROM table2)