我只是用外行的话说这个,因为我是一个完整的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)
但事实证明这是错误的,因为我使用电子表格对它进行了交叉检查,但我得不到相同的结果。
非常感谢任何帮助。感谢。 的
答案 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