将表链接到第二个表中的两列

时间:2012-12-20 09:07:37

标签: sql oracle

我有一个问题,我认为我的主要问题是弄清楚如何用它来表达谷歌的可接受答案。

情况:

表A是'Invoice'它有一个列,它在两个地方链接到表B'Jobs'。它可以链接到我们的“工作号码”列或“客户编号”列。主要问题是,如果我们设置作业而不是设置作业的客户端,“客户编号”和“作业编号”可以是相同的编号。

我得到的是,每当两列中的数字都相同时,结果就会重复。

现在这极其简化了这种情况,试图让它更容易理解,但我本质上是在寻找一个语句,看看表A得到的值然后与列B1进行比较,如果不匹配则比较它如果不匹配则反对B2,然后将其从结果中排除。关键是,如果它与B1比较时匹配,则不会继续将其与B2进行比较。

对此的任何帮助都将非常感激,即使它只是非常明显的操作员或功能方向的一个点。它正在结束漫长的一天。

谢谢。

编辑:

进一步说明:

Invoice Table
---------------------------------
PK,  INVOICE_NUMBER,  LINK_TO_JOB

Job Table
---------------------------------
PK, JOB_NUMBER, CLIENT_JOB_NUMBER

现在问题的关键在于两个PK都是数据库生成的序号,没有重叠。发票编号和作业编号都是应用程序生成的顺序编号,没有重叠,作业的链接是应用程序生成的,当发票开始时,会根据规则链接到作业表中的两个字段之一。为简单起见,我们可以说这些规则是指如果没有链接到作业号的客户端作业号链接。

现在客户端的工作号码是一个写入买家的字段,很多错误都可以并且确实发生了,但是很多垃圾也会被放入这个领域。像'电子邮件''传真'这样的东西是非常常见的答案。因此,如果有像“电子邮件”那样的废话,它会链接到一系列其他包含相同“电子邮件”标记的字段。

这就是问题所在。

问题二Where声明:

SELECT INVOICE_NUMBER,
       LINK_TO_JOB
       JOB_NUMBER,
       CLINET_JOB_NUMBER

    FROM JOBS_TABLE a, 
         INVOICE_TABLE b

如何设置where语句以获得所需结果,我已经尝试过:

WHERE (LINK_TO_JOB = JOB_NUMBER OR LINK_TO_JOB = CLIENT_JOB_NUMBER)

这会返回许多倍数,例如当作业编号和客户端作业编号相同时,以及在答案“电子邮件”中写入多个相同的内容时等等。现在这可能是不可避免的,我最终会使用此区别声明尽我所能,尽我所能。不过我想做的是:

WHERE (LINK_TO_JOB = JOB_NUMBER (+) OR LINK_TO_JOB = CLIENT_JOB_NUMBER (+))

由于您可以将外部联接与OR运算符一起使用,因此会返回错误。

如果没有任何结果,我可能只需要使用OR连接,然后输入Select Distinct,然后将冗余构建到Invoicing流程中,这样当数据库错过链接时,手动进程会捕获它们。

虽然我对任何想法都很满意。

3 个答案:

答案 0 :(得分:1)

使用SELECT DISTINCT从结果集中删除重复项。

答案 1 :(得分:1)

这样做的一种方法是使用set操作。 UNION将为您提供一组独特的价值观。你没有提供太多细节,所以我猜测具体细节:你需要根据自己的需要修改它们。

with j as ( select * from jobs )
select j.*, inv.*
from invoices inv
     join j on ( inv.job_no = j.job_no)
union
select j.*, inv.*
from invoices inv
     join j on ( inv.job_no = j.client_no)

您遇到困难的根本原因是数据模型已经半熟。在适当的设计中,INVOICES.JOB_NO将具有引用JOBS.JOB_NO的外键关系。而JOBS.CLIENT_NO将是一个额外的信息,一个业务密钥,但不会被INVOICES引用。当然它可以显示在实际发票上,这就是大自然给我们加入的原因。

答案 2 :(得分:0)

好的,这里的小组努力。我使用了像APC建议的联合联接。并修改以适应我的数据及其所有的怪癖(阅读法语无法从纸袋中找到数据模型)然后我用user1871207和Hikaru-Shindo建议的独特声明包围了所有内容。

但对我来说是负面影响,我的问题很明显的原因有几个,但我难以掌握/解释的大部分信息是发票不总是用于工作,再加上事实是发票可以合并(刚刚搞砸了所有东西),这只是一个很大的混乱,我帮你设置了一小块两年的透明胶带。

我在这里继续职业生涯的唯一希望就是利用出现的例外情况(他们会像蜘蛛猴一样来到我身边!)希望能够修改整个发票流程,以便我们报告一些基本的损益数字

为你的所有帮助干杯。