2012-10-05 64 views
0

我试图将同一张表格与其自身进行比较,以将一个员工位置与另一位表格进行比较。我希望能够选择一名员工是否只来自另一名员工的某个地点。将表格与自身进行比较

表看起来像这样

StaffNo LocoNo 
1   1 
1   2 
1   3 
3   2 
3   3 
3   4 
4   1 
4   2 
5   2 
5   3 
6   1 
6   2 

说比较职员1和4

结果将

StaffNo LocoNo 
1   3 

我已经试过内部联接和EXCEPT,但现在看来似乎不起作用。

+0

什么样的SQL的? – podiluska

+0

你想要“第一个StaffNo在场的地方,但第二个不在”或“只有以下两名员工中的一个在场的地点”?即搜索是否意味着对你给出的两个职员编号的顺序无动于衷? –

回答

1
SELECT StaffNo 
    , LocoNo 
    FROM Tbl A 
WHERE NOT EXISTS 
     (SELECT 1 
     FROM Tbl B 
     WHERE A.StaffNo <> B.StaffNo 
      AND A.LocoNo = B.LocoNo) 
+0

我用你的例子,并使用它一点点,以使其工作。这是我终于从你的例子中完成的工作。 SELECT StaffNo,LocoNo FROM TBL甲 WHERE A.StaffNo = 1 AND NOT EXISTS (SELECT 1 FROM TBL乙 WHERE B.StaffNo = 4 AND A.LocoNo = B.LocoNo) –

1

内部联接只在联接的两端匹配时才返回结果。当你在寻找差异时,你需要一个外部联接。喜欢这个。

select 
    COALESCE(t1.staffid, t2.staffid) as staff, 
    COALESCE(t1.locationid, t2.locationid) as location 
from 
    (select * from table where staffid=1) t1 
     full outer join 
    (select * from table where staffid=4) t2  
     on t1.locationid = t2.locationid 
where t1.locationid is null 
or t2.locationid is null 
0
select staffno,locono from tbl where staffno in (1,4) and locono in 
((select locono from tbl where staffno = 1 
except 
select locono from tbl where staffno = 4) 
union 
(select locono from tbl where staffno = 4 
except 
select locono from tbl where staffno = 1)) 
1

另一种解决方案使用减号/ UNION ALL:

with 
    v_1 as (select locono from from table where staffid=1), 
    v_2 as (select locono from from table where staffid=2) 
select * from (
(select 1 staffid, locono from v_1 
minus 
select 1 staffid, locono from v_2 
) 
union all 
(
select 2 staffid, locono from v_2 
minus 
select 2 staffid, locono from v_1 
)) order by staffid, locono