麻烦加入3个表

时间:2012-10-31 20:05:48

标签: sql sql-server

我是编写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个左连接: With only 1 Left Join

两个左连接: Second

您可以看到ERP软件在1个PO#下有多个作业,我只对显示匹配作业编号的行感兴趣。 Third

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字段正在重复第一个结果,因为每条线实际上应该是不同的。

4

我过滤到只显示一份工作。它们应该只有一列。

获取额外的行,但拥有我需要的所有数据

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

1 个答案:

答案 0 :(得分:0)

您希望显示有关jheadjjops表的详细信息,但只想显示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,但子查询方法更简单。