具有多对多关系的3个表上的SQL查询帮助

时间:2015-03-11 18:43:31

标签: mysql .net sql-server

我在连接多个表时遇到了检索所需数据的问题。为了达到正确的结果,我必须首先创建一个名为vwinvgrossrev的视图(如下所示):

SELECT     dbo.inv_item.inv_num, dbo.inv_item.co_line, 
dbo.inv_hdr.co_num, dbo.inv_hdr.inv_date, dbo.inv_item.qty_invoiced, 
dbo.inv_item.price
FROM         dbo.inv_item INNER JOIN
dbo.inv_hdr ON dbo.inv_item.inv_num = dbo.inv_hdr.inv_num

然后我必须加入我的决赛桌上的观点才能创建我想要的值的正确总和

select sum(vwinvgrossrev.qty_invoiced*vwinvgrossrev.price) 
from     vwinvgrossrev,coitem
WHERE vwinvgrossrev.co_num=coitem.co_num 
AND coitem.Uf_Erne='Y'
AND vwinvgrossrev.co_line=coitem.co_line
AND DATEPART(mm,vwinvgrossrev.inv_date) = DATEPART(mm,Getdate()) 
AND YEAR(vwinvgrossrev.inv_date) = YEAR(Getdate())

我的问题是这个。无论如何在单个查询中执行此操作。问题是所有3个表都有多对多的关系,并且在连接所有3个表时总是返回错误的值。

2 个答案:

答案 0 :(得分:0)

您需要优化数据库架构以规范化多对多关系。无论您当前的问题如何,这都是一个给定的标准做法。事实上,它将简化您当前的问题是原因。有许多教程/博客/等,以向您展示如何使用连接表执行此操作,因此我不会在此处进行此操作。

答案 1 :(得分:0)

如果您当前的查询(使用视图)为您提供了所需内容,那么我相信此查询会在单个查询中为您提供相同的内容:

SELECT sum(inv_item.qty_invoiced*inv_item.price) 
FROM     inv_item
JOIN inv_hdr ON dbo.inv_item.inv_num = dbo.inv_hdr.inv_num
JOIN coitem ON (inv_hdr.co_num=coitem.co_num 
    AND inv_item.co_line=coitem.co_line)
WHERE coitem.Uf_Erne='Y'
AND vwinvgrossrev.co_line=coitem.co_line
AND DATEPART(mm,inv_hdr.inv_date) = DATEPART(mm,Getdate()) 
AND YEAR(inv_hdr.inv_date) = YEAR(Getdate())

然而,如果你正在寻找的话,我会感到惊讶。

我假设你实际上并没有在所有3之间有多对多。我假设inv_hdr有一个唯一的inv_num而inv_item有很多这样的。类似地,我假设co_num在inv_hdr中是唯一的,但在coitem中有多次出现。这些不是多对多,而是一对多的关系。由于SELECT乘以行,我认为你将比你想要的总和更多。

如果您只对coiteminv_item.qty_invoiced感兴趣,为什么还要包含inv_item.price?是否只是限制Uf_Erne列? coitem始终为co_numco_line {1}}提供1或0条记录吗?

总之,我在没有视图的情况下在一个查询中复制了您的查询,但我认为您可能需要考虑这是否真的是您想要的。