ПОЛНОЕ НАРУЖНОЕ СОЕДИНЕНИЕ, которое несколько ВНУТРЕННЕЕ - PullRequest
2 голосов
/ 05 июля 2011

Вот проблема, с которой я сталкиваюсь:

  • Я получаю ожидаемые X от клиента
  • я получаю осознанные иксы от фирмы учреждения
  • Мне нужно полное внешнее соединение ожидаемые и реализованные Xs на коде равенство так же долго, как и они ЖЕ ФАЙЛ РАБОТЫ

Например:

Realized Xs for job file #123 : A and B
Expected Xs for job file #123 : A and C
Expected Xs for job file #456 : B

Ожидаемый результат:

Job_File Realized Expected
-------- -------- --------
123      A        A
123      B        NULL
123      NULL     C
456      NULL     B

Конечно, 123 реализовано B , которое НИКОГДА не должно совпадать с ожидаемым 456 B , поскольку они не принадлежат одному и тому же файлу задания.

Итак, я хотел бы одновременно выполнить полное внешнее соединение в коде и внутреннее соединение в идентификаторе файла задания.

Это кажется странным, но ... на самом деле очень логичным. Как, черт возьми, я могу это сделать ???

Заранее большое спасибо за вашу драгоценную помощь! : -)

Ответы [ 5 ]

6 голосов
/ 05 июля 2011

Вам просто нужно присоединиться к двум условиям вместо одного!

SELECT COALESCE(realized.Job_File, expected.Job_File), 
       realized.code, 
       expected.code
FROM realized 
    FULL OUTER JOIN expected 
        ON realized.Job_File = expected.Job_File 
        AND realized.Code = expected.Code 
2 голосов
/ 05 июля 2011

Это должно сработать, так как это полное внешнее соединение, как вы сказали сами:

select
   isnull(r.JobFile, e.JobFile) as JobFile, Realized, Expected
from
   (select 123 as JobFile, 'A' as Realized
   union all
   select 123, 'B')  r

   full outer join
   (select 123 as JobFile, 'A' as Expected
   union all
   select 123, 'C'
   union all
   select 456, 'B')  e on r.JobFile = e.JobFile and r.Realized = e.Expected

   order by 1, 2
2 голосов
/ 05 июля 2011

Полное внешнее объединение должно работать нормально (при условии, что SQL Server поддерживает его, я проверял только с помощью Oracle):

create table realized_xs(job_file number, module varchar2(10));
create table expected_xs(job_file number, module varchar2(10));

insert into realized_xs(job_file, module) values(123, 'A');
insert into realized_xs(job_file, module) values(123, 'B');
insert into expected_xs(job_file, module) values(123, 'A');
insert into expected_xs(job_file, module) values(123, 'C');
insert into expected_xs(job_file, module) values(456, 'B');

select coalesce(r.job_file, e.job_file) job_file, 
 r.module r_module, e.module e_module
from realized_xs r 
full outer join expected_xs e on r.job_file = e.job_file and r.module = e.module
2 голосов
/ 05 июля 2011

Итак, я хотел бы одновременно выполнить полное внешнее соединение в коде и внутреннее соединение в идентификаторе файла задания.

Я предполагаю, что у вас есть эти таблицы:

Jobs
  id

Realized
  id
  job_id

Expected
  id
  job_id

Тогда вы можете делать именно то, что вы сказали, что хотели сделать!

SELECT j.job_id, r.id, e.id
FROM Jobs j
INNER JOIN (Realized r FULL OUTER JOIN Expected e
            ON r.job_id = e.job_id)
ON j.id = r.job_id
1 голос
/ 05 июля 2011

Ваши ответы верны, если вы задали вопрос.Спасибо всем за то, как быстро вы ответили!: -)

Я не мог легко объяснить, почему, к сожалению, это не может быть применимо к моему конкретному контексту, не добавив слишком много специфических бизнес-деталей к сообщению.Чистое ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ приведет к добавлению миллиардов нежелательных несоответствующих строк.

К счастью, коллега нашел хитрость, и я возвращаю ее по очереди, в случае, если кто-то может распознать его собственную проблему, несмотря на то, какЯ смутно придерживаюсь этого: идея состоит в том, чтобы (просто) ВНУТРЕННО ПОДКЛЮЧИТЬ к реализованному по ожидаемому идентификатору файла задания, а затем ПОЛНОСТЬЮ ВНЕШНИЙ, снова присоединить результат к ожидаемому коду на этот раз.

Надеюсь, этомог бы помочь кому-то ...

...