Объединенные столбцы не должны совпадать в 2 таблицах - PullRequest
0 голосов
/ 10 февраля 2011

Я просто изложу это в терминах непрофессионала, так как я полный нуби:

У меня есть 2 таблицы A и B, каждая из которых имеет 2 интересующих столбца: employee_number и salary.

Что я хочу сделать, так это извлечь строки «комбинации» employee_number и salary из A, которых нет в B, но каждый из employee_number и salary должен присутствовать в обоих.

Я ищучтобы выполнить это с 2 следующими условиями (пожалуйста, прости неправильные имена функций .. это просто для того, чтобы «красноречиво» представить проблему):

1.) A.unique (employee_number) существует в B.unique (employee_number) AND A.unique (оклад) существует в B.unique (оклад)

2.) A.concat (employee_number, оклад) <> 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)

но оказалось, что это неправильно, поскольку я проверил это с помощью электронных таблицd Я не получаю тот же результат.

Любая помощь будет принята с благодарностью.Спасибо.

Ответы [ 2 ]

1 голос
/ 21 октября 2011

Для облегчения понимания я пропустил 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)

Если у вас проблемы со строками, содержащими нули, вы можете попробовать что-то вроде этого: И (a.salery! = B.salery ИЛИ (a.salery НЕДЕЙСТВИТЕЛЬНО И b.salery НЕДЕЙСТВИТЕЛЕН) или (a.salery НЕТ NULL и b.salery is NULL))

0 голосов
/ 05 марта 2011

Я думаю, вы ищете что-то в этом роде.

(пример данных)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...