2017-07-20 26 views
-1

我希望有下面爲您協助SQL-選擇1個輸出的行與同一ID

Table A 
ID Name Location  
A1 John London  
A2 Mike London  
A3 Adam London  
A4 Steve London  
A5 James London 


Table B 
ID TEST Results  
A1 TEST1 SATISFACTORY  
A1 TEST2 UNSATISFACTORY  
A1 TEST3 SATISFACTORY  
A2 TEST1 SATISFACTORY  
A2 TEST2 UNSATISFACTORY  
A2 TEST3 SATISFACTORY  
A3 TEST1 SATISFACTORY  
A3 TEST2 SATISFACTORY  
A4 TEST1 UNSATISFACTORY  
A4 TEST2 UNSATISFACTORY  
A5 TEST0 NOT TESTED 

此刻我的查詢是足夠的信息:

Select Distinct TableA.ID, TableA.Name, TableA.Loacation, TableB.ID, 
TableB.Results 
Left outer join TableA on TableA.ID = TableB.ID 

所以,當我運行此查詢我得到下面的結果

ID NAME ID Results 
A1 JOHN A1 SATISFACTORY 
A1 JOHN A1 UNSATISFACTORY 
A2 MIKE A2 SATISFACTORY 
A2 MIKE A2 UNSATISFACTORY 
A3 ADAM A3 SATISFACTORY 
A4 STEVE A4 UNSATISFACTORY 
A5 JAMES A5 NOT TESTED 

所以,如果所有的特定ID的測試是令人滿意的(A3),然後我得到1輸出 「A3 ADAM A3滿意」

因此,如果所有的特定ID的測試是不能令人滿意的(A4),然後我得到1個 輸出

A4 STEVE A4 UNSATISFACTORY 

此外,如果所有用於特定ID的測試不測試(A5),然後我得到1輸出

A5 STEVE A5 NOT TESTED 

雖然如果我有一些令人滿意的&不盡人意則它返回一個2 ID行

A1 JOHN A1 SATISFACTORY 
A1 JOHN A1 UNSATISFACTORY 
A2 MIKE A2 SATISFACTORY 
A2 MIKE A2 UNSATISFACTORY 

我想要實現的是,如果有令人滿意的&不滿意1號混合,然後輸出只顯示不盡人意。我試過case語句,按組,加入,MIN/MAX ......只是沒有運氣

+0

請添加一個標籤告訴我們什麼RDBMS(Postgres的,了Oracle,SQLServer等)這是 –

+0

你期待後輸出 – mohan111

+0

'選擇TableA.ID,TableA.Name,TableA.Location, MAX(TableB.Results) TableA.ID上的左外部連接TableA.ID = TableB.ID GROUP BY TableA.ID,TableA.Name,TableA.Location,' – dnoeth

回答

0

試試這個,分割問題轉化爲3例,聯合各個結果一起:

-- SATISFACTORY & UNSATISFACTORY 
SELECT DISTINCT 
A.ID, 
A.Name, 
B.ID, 
'SATISFACTORY & UNSATISFACTORY' AS Result 
FROM TableA AS A 
INNER JOIN TableB AS B on A.ID = B.ID 
WHERE B.Results='SATISFACTORY' 
AND B.Results='UNSATISFACTORY' 
UNION 
--SATISFACTORY & NOT UNSATISFACTORY 
SELECT DISTINCT 
A.ID, 
A.Name, 
B.ID, 
B.Results 
FROM TableA AS A 
INNER JOIN TableB AS B on A.ID = B.ID 
WHERE B.Results='SATISFACTORY' 
AND B.Results<>'UNSATISFACTORY' 
UNION 
--NOT SATISFACTORY & UNSATISFACTORY 
SELECT DISTINCT 
A.ID, 
A.Name, 
B.ID, 
B.Results 
FROM TableA AS A 
INNER JOIN TableB AS B on A.ID = B.ID 
WHERE B.Results<>'SATISFACTORY' 
AND B.Results='UNSATISFACTORY' 
+0

您的WHERE邏輯很奇怪。爲什麼要指定一個列必須同時等於一個值而不等於另一個值 - 邏輯上,在等號出現的情況下不等於多餘。 'WHERE mycol = 1和mycol!= 2'與'WHERE mycol = 1'相同 - 考慮一下 –

0

的只有你沒有詳細說明的是結果的優先級。這個回答假設未測試勝過不滿意勝過滿意:

SELECT 
    table_a.id, table_a.name, b_ranked.test, b_ranked.results 
FROM 
    table_a 
    LEFT JOIN 
    (
    SELECT 
    id, 
    test, 
    results, 
    ROW_NUMBER() OVER(PARTITION BY id, test, ORDER BY CASE results WHEN 'NOT TESTED' THEN 0 WHEN 'UNSATISFACTORY' THEN 1 WHEN'SATISFACTORY' THEN 2) as rown 
    FROM 
    table_b 
) b_ranked 
    ON table_a.id = b_ranked.id and b_ranked.rown = 1 

神奇的是由ROW_NUMBER()調用來完成,它基本上是把一個遞增計數器上具有相同idtest行和具體訂單的結果,因此最讓你感興趣的是你總是編號爲1。大多數現代數據庫支持這一點,但你可能不會(因此爲什麼我在評論中問)。使用這種方法可以避免昂貴的操作將表格重新加入到自身,工會,區別和其他密集的重複方式中去除結果

如果您想深入瞭解它的工作原理,只需運行內部子查詢,然後制定出它是如何鏈接到外部

0

我認爲每個ID - Name對你打算得到一個單一的記錄,這將是UNSATISFIED如果有至少一個UNSATISFIED結果對於給定的IDNameSATISFIED如果有沒有UNSATISFIED,但至少是SATISFIEDNOT TESTED,如果至少有一個NOT TESTED值。請注意,此解決方案不包括在B中沒有記錄的情況下在A中記錄的行。如果你想包括這個,你將需要使用left join和默認ResultsNOT TESTED。這裏使用的想法是基於這樣的觀察

在你的潛在結果「未測試」 <「滿意」 <「不滿意」

,因此,如果至少有一個UNSATISFIED,那麼這將是最大值。如果給定測試儀不存在UNSATISFIED並且至少發生了SATISFIED結果,則SATISFIED只能是最大值。否則,如果有一個NOT TESTED值,那麼它將是最大值。

select A.ID, A.Name, max(B.Results) as Results 
from A 
join B 
on A.ID = B.ID 
group by A.ID, A.Name