[mysql]SQL 查询帮助上 3 表具有多对多关系

标签: MySQL SQLServer .Net
发布时间: 2017/4/4 14:45:04
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有一个问题联接多个表检索我所需的数据。 为了完成适当的结果,我不得不先创建一个视图 (如下图所示) 被称为︰ 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 表时总是返回错误值。

解决方法 1:

如果你正在寻找你当前的查询 (使用视图) 给了你然后我相信此查询会给你同样的事情在单个查询中︰

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 内。 这些不是多多,但相当 1 对多的关系。因为 SELECT 乘以我认为你要累加的方式比你想要的行。

你为什么想要包括 coitem 在所有如果你只是感兴趣 inv_item.qty_invoicedinv_item.price ?它是只是限制在 Uf_Erne 列上吗?是 coitem 总是会有 1 或 0 的记录的 co_numco_lineUf_Erne='Y'

总括而言,我已经重新生成了您查询在单个查询中没有视图,但我认为你可能需要通过是否认为这真的是你想要什么。

赞助商