我在连接多个表时遇到了检索所需数据的问题。为了达到正确的结果,我必须首先创建一个名为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个表时总是返回错误的值。
答案 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
乘以行,我认为你将比你想要的总和更多。
如果您只对coitem
和inv_item.qty_invoiced
感兴趣,为什么还要包含inv_item.price
?是否只是限制Uf_Erne列? coitem
始终为co_num
和co_line
{1}}提供1或0条记录吗?
总之,我在没有视图的情况下在一个查询中复制了您的查询,但我认为您可能需要考虑这是否真的是您想要的。