我是编写SQL查询的新手,并且一直试图从3个不同的表中提取信息并将它们链接在一起。
数据驻留在Microsoft SQL Server中。
这是我当前的查询(这不符合我的意图):
SELECT h.jhhold, h.jhjob, h.jhpart, h.jhrev, h.jhcust, h.jhextd, o.jadesc, h.jhpqty, o.jaoqty, o.jacqty, o.japo, o.javend
FROM Jhead AS h
LEFT JOIN jjops AS o ON h.jhjob = o.jajob
LEFT JOIN hpodt AS p ON h.jhjob = p.hdjob
WHERE h.jhpcmp = 0 AND o.jatype = 2 AND o.jacqty < o.jaoqty AND japcmp = 0
ORDER BY h.jhjob
解释我想要做什么。我有一个职位标题表 Jhead ,一个职位明细表 jjops 和一个采购订单明细表 hpodt 。我相信作业号是jhead表中的主键。
这是我的问题:只要我添加第二个左连接,我就会得到许多额外的重复信息。
我尝试过使用GROUP BY jhead.jhjob,但收到以下错误:
“列'jhead.jhhold'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。”
所以我研究了错误,其中一个解决方案是使我的GROUP BY看起来像这样: GROUP BY jhead.jhjob,jhead.jhhold,jhead.jhpart,jhead.jhrev,jhead.jhcust,jhead.jhextd
但是一旦我输入jhead.jhextd,我就会收到此错误: “除非使用IS NULL或LIKE运算符,否则无法比较或排序text,ntext和image数据类型。”
现在已经打了一堵砖墙。我确实看到你可以将类型更改为NVARCHAR。我真的不想按描述字段进行排序,因为它是唯一的,可能在服务器上非常繁重。有一个更好的方法吗?
使用示例数据进行修改 我删除了额外的字段以简化查询,并过滤了1个工作号的结果。
只有1个左连接:
两个左连接:
您可以看到ERP软件在1个PO#下有多个作业,我只对显示匹配作业编号的行感兴趣。
QUERY UPDATED
SELECT h.jhhold, h.jhjob, h.jhrev, o.jadesc, h.jhpqty, o.jaoqty, o.jacqty, o.japo, o.javend, p.hdprcd, p.hdrecd
FROM Jhead AS h
LEFT JOIN jjops AS o ON h.jhjob = o.jajob
LEFT JOIN hpodt AS p ON h.jhjob = p.hdjob
WHERE h.jhpcmp = 0 AND o.jatype = 2 AND o.jacqty < o.jaoqty AND japcmp = 0 AND p.hdjob = h.jhjob AND p.hdpo = o.japo
ORDER BY h.jhjob
这接近我想要的。现在的问题是我的jadesc字段正在重复第一个结果,因为每条线实际上应该是不同的。
我过滤到只显示一份工作。它们应该只有一列。
获取额外的行,但拥有我需要的所有数据
SELECT h.jhhold, h.jhjob, h.jhrev, o.jadesc, h.jhpqty, o.jaoqty, o.jacqty, o.japo, o.javend, p.hdprcd, p.hdrecd, p.hdseq
FROM Jhead AS h
LEFT JOIN jjops AS o ON h.jhjob = o.jajob
LEFT JOIN hpodt AS p ON h.jhjob = p.hdjob
WHERE (h.jhpcmp = 0 AND o.jatype = 2 AND o.jacqty < o.jaoqty AND japcmp = 0 AND p.hdjob = h.jhjob AND p.hdpo = o.japo AND p.hdseq = o.jaseq AND o.jaopr != 'PT')
OR (h.jhpcmp = 0 AND o.jatype = 2 AND o.jacqty < o.jaoqty AND japcmp = 0 AND o.japo = 0 AND o.jaopr != 'PT')
ORDER BY h.jhjob, o.jaseq
答案 0 :(得分:0)
我猜您希望显示有关jhead
和jjops
表的详细信息,但只想显示hpodt
表中的一些汇总信息
如果是这种情况,你应该这样做:
SELECT
h.jhhold, h.jhjob, h.jhpart, h.jhrev, h.jhcust, h.jhextd,
o.jadesc, h.jhpqty, o.jaoqty, o.jacqty, o.japo, o.javend,
(SELECT COUNT(*) FROM hpodt p WHERE p.jhjob = h.hdjob) AS po_line_count,
CASE WHEN EXISTS (SELECT * FROM hpodt p WHERE p.jhjob = h.hdjob)
THEN 'found it'
ELSE 'not found'
END AS info_on_hpodt
FROM
Jhead AS h
LEFT JOIN jjops AS o ON h.jhjob = o.jajob
WHERE
h.jhpcmp = 0 AND o.jatype = 2 AND o.jacqty < o.jaoqty AND japcmp = 0
ORDER BY
h.jhjob
我不清楚您希望从hpodt
表中获得哪些具体信息,但我想这种使用子查询的策略只需在其WHERE
子句中添加其他条件即可。
另一种选择是使用window functions,但子查询方法更简单。