2012-10-31 109 views
2

我是新來編寫SQL查詢,並一直試圖從3個不同的表中提取信息並將其鏈接在一起。麻煩加入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。我相信工作號碼是頭表中的主要關鍵。

這是我的問題:一旦我添加第二個左連接,我結束了很多額外的重複信息行。

我已經使用GROUP BY jhead.jhjob嘗試,但得到以下錯誤:

「,因爲它並不在聚合函數或GROUP載列‘jhead.jhhold’在選擇列表中無效。BY子句」

於是我研究了誤差的解決方案之一是讓我GROUP BY這個樣子的: GROUP BY jhead.jhjob,jhead.jhhold,jhead.jhpart,jhead.jhrev,jhead.jhcust ,jhead.jhextd

但是,只要我把jhead.jhextd我得到這個錯誤: 「文本,ntext和圖像數據類型無法進行比較或排序,但使用IS NULL或LIKE運算符時除外。」

現在已經撞到了一堵磚牆。我確實發現可以將類型更改爲NVARCHAR。我不想按照說明字段進行排序,因爲它是唯一的,可能會對服務器造成嚴重的負擔。有一個更好的方法嗎?

使用示例數據編輯: 我刪除了額外的字段以簡化查詢並篩選了1個作業編號的結果。

只有1左連接: With only 1 Left Join

與這兩個左聯接: Second

ERP軟件,你可以看到有下1個PO#多個就業機會,我只顯示與線感興趣工作號碼匹配。 Third

查詢而更新

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 
+4

你可以發佈一些樣本數據,然後預期的結果?如果你有多個記錄與每個'jhjob'關聯,你只需要一個,你想要返回哪一個? – Taryn

+0

我現在盡我所能去做。 – MAK

+0

請閱讀並遵循有關使用別名的這篇文章:http://msdn.microsoft.com/en-us/library/ms187455(v=sql.90).aspx –

回答

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,但子查詢方法更簡單。

+0

嗯,這可能是我需要的。我只需要弄清楚你做了什麼以及如何應用它。實際上我現在有來自所有三個表的數據,但是在PO#'o.japo = 0'的情況下,出於某種原因,我的列中顯示的值應用於我的'hpodt'表,這導致重複的行。 'o.japo = 0'時,不會顯示應用於'hpodt'的列的數據 – MAK