Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 完全的外部连接,有点内部连接_Sql_Sql Server_Inner Join_Full Outer Join - Fatal编程技术网

Sql 完全的外部连接,有点内部连接

Sql 完全的外部连接,有点内部连接,sql,sql-server,inner-join,full-outer-join,Sql,Sql Server,Inner Join,Full Outer Join,以下是我面临的问题: 我从客户端收到预期的X 我收到了公司的X 代理机构 我必须完全外接 预期和实现的xson代码 平等只要他们属于 相同的作业文件 例如: 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 -------- -------- ---

以下是我面临的问题:

  • 我从客户端收到预期的X
  • 我收到了公司的X 代理机构
  • 我必须完全外接 预期和实现的xson代码 平等只要他们属于 相同的作业文件
例如:

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匹配,因为它们不属于同一个作业文件

所以,就好像我想同时对代码进行完全外部连接,对作业文件id进行内部连接

这看起来很奇怪,但是。。。事实上,这很合乎逻辑。我到底怎么能做这样的事


非常感谢您的宝贵帮助!:-)

您只需要在两个条件而不是一个条件下加入

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 
所以,就好像我想同时对代码进行完全外部连接,对作业文件id进行内部连接

我假设您有以下表格:

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

完全外部联接应该可以正常工作(假设SQL Server支持它,我只使用Oracle进行了检查):


这应该是可行的,因为这是一个完整的外部连接,正如你自己所说:

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

考虑到问题的发布方式,您的答案都是正确的。谢谢你们回答得这么快!:-)

我很难解释为什么不幸的是,如果不在帖子中添加太多具体的业务细节,它就不能应用到我的特定上下文中。纯粹的完全外部连接将导致添加数十亿条不需要的非匹配线

幸运的是,一位同事发现了这个诀窍,我把它反过来还给了他,以防有人能在我的问题中发现他自己的问题,尽管我把它说得很含糊:这个想法(简单地)是(简单地)将实现的内部连接到预期的作业文件id上,然后再次通过代码将结果完全连接到预期的外部


希望这能帮助某人…

您能粘贴所有表的结构吗,也许可以使用一些示例数据?您有我们可以查看的真实格式的数据吗?如果我们不知道原作是什么样子的话,就很难给你一些东西。事实上,这让我很恼火;听起来你的业务细节是如此隐私,以至于你无法发布足够的信息,甚至给我们一个机会来回答你的实际问题。我看不到任何证据表明你看过答案。。。。那么,为什么要浪费每个人的时间,一开始就发布这个问题呢?@Chris业务细节不是私人的,但我觉得描述这个案例会变得不那么容易,而且会混合各种各样的问题。基本上,所有的作业文件都实现了Xs,只有相对少数的作业文件也期望Xs进入我的文章的范围。一个纯粹的完全外部连接将考虑所有已实现的X,这太多了数千行。
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