连续列在2个表中不匹配

时间:2011-02-10 17:14:38

标签: postgresql

我只是用外行的话说这个,因为我是一个完整的noobie:

我有2个表A和B,两个都有2列兴趣,即:employee_number和salary。

我要做的是从A中提取employee_number和工资的'组合'行,但不存在于B中,但employee_number和salary中的每一个都应存在于两者中。

我希望在以下2个条件下进行此操作(请原谅错误的功能 名字..这只是为了“雄辩地”提出问题:)

1。)A.unique(employee_number)存在于B.unique(employee_number)和A.unique(薪水) 存在于B.unique(薪水)

2。)A.concat(employee_number,salary)<> B.concat(EMPLOYEE_NUMBER,薪水)

注意:A和B位于不同的数据库中,因此我希望使用dblink来执行此操作。

这是我尝试过的:

SELECT distinct * FROM dblink('dbname=test1 port=5432 
        host=test01 user=user password=password','SELECT employee_number,salary, employee_number||salary AS ENS FROM empsal.A')
AS A(employee_number int8, salary integer, ENS numeric)
LEFT JOIN empsalfull.B B on B.employee_number = A.employee_number AND B.salary = A.salary
WHERE A.ENS not in (select distinct employee_number || salary from empsalfull.B)

但事实证明这是错误的,因为我使用电子表格对它进行了交叉检查,但我得不到相同的结果。

非常感谢任何帮助。感谢。

2 个答案:

答案 0 :(得分:1)

为了便于理解,我遗漏了dblink。 因为,第一个选择B中的行等于A中的雇员数以及A中的销售额,因此它们的连接值也相等(如果您希望这不是真的,请提供一些测试数据)。

SELECT * from firsttable A
LEFT JOIN secondtable B where 
    (A.employee_number = B.employee_number AND a.salery != b.salery) OR 
    (A.salery = B.salery AND A.employee_number != B.employee_number)

如果您遇到包含空值的行的麻烦,您可能还会尝试这样的事情:  AND(a.salery!= b.salery OR(a.salery IS NULL AND b.salery IS NOT NULL)或(a.salery IS NOT   NULL和b.salery IS NULL))

答案 1 :(得分:0)

我认为你正在寻找这些方面的东西。

(样本数据)

create table A (
    employee_number integer primary key,
    salary integer not null
);

create table B (
    employee_number integer primary key,
    salary integer not null
);

insert into A values 
(1, 20000),
(2, 30000),
(3, 20000);  -- This row isn't in B

insert into B values
(1, 20000),  -- Combination in A
(2, 20000),  -- Individual values in A
(3, 50000);  -- Only emp number in A

select A.employee_number, A.salary
from A
where (A.employee_number, A.salary) NOT IN (select employee_number, salary from B)
  and  A.employee_number IN (select employee_number from B)
  and  A.salary IN (select salary from B)

输出:3,20000