2016-07-22 35 views
0

我有2個數據庫。我想寫一個查詢,它將從兩個數據中提取數據並將它們綁定到相同的結果中。是否可以從多行中選擇數據用於單行輸出?

用戶數據庫:

id username group 
1 steve  group1 
2 joe  group1 
3 tom  group2 

數據數據庫:

id userid fieldname fieldresult 
1 2  phone  867-5309 
2 2  address  123 elm st 
3 1  address  666 park avenue 

如果我只是想史蒂夫的地址,我可以這樣寫:

select user.username, data.fieldresult from user, data where user.id = data.userid and data.fieldname = 'address' and user.username = 'steve'; 

其結果將是:

username fieldresult 
steve  666 park avenue 

但是如果我想在單行中想要所有joe的fieldresults呢?這可以從查詢本身做到,還是我必須在代碼中處理?

基本上,我想看看:

username phone  address 
joe   867-5309 123 elm st 

這是一廂情願的想法?我甚至不需要「電話」和「地址」作爲標題,只要我可以得到他們的價值在相同的結果。

注意:我正在使用現有的數據庫,這是如何存儲信息。

編輯: 此外,我需要在更大的基礎上做到這一點。不用用戶名查詢,我可以以同樣的方式爲整個組中的每個用戶獲取這些信息。

+0

通過「兩個數據庫」你的意思是(在相同的數據庫和相同的所有者/架構下)「兩代表」? – mathguy

+0

@woodchipper - 不完全是鏈接問題的副本。鏈接的問題不需要加入,這是一個問題。這個相關的問題被要求重新提供同樣的信息。當前的問題更有意義,第二個表是EAV,而在關聯問題中則不是這種情況。 – mathguy

+0

@mathguy有道理,我刪除了我原來的評論。 – Woodchipper

回答

1

嘗試

select  a.username, 
      b.fieldresult as phone, 
      c.fieldresult as address 
from  #user a 
left join #data b on a.id=b.userid and b.fieldname='phone' 
left join #data c on a.id=c.userid and c.fieldname='address' 
where  a.id = 2 
1

您可以嘗試在datadb表擺動的聯繫信息,然後與用戶

select * from userdb..[user] u join 
(
select userid,phone, address from 
(
select userid,fieldname,fieldresult from datadb..data 
) as a pivot 
(
    max(fieldresult) for fieldname in (phone, address) 
) piv) as a 
on a.userid = u.id 

,這將導致一些如下加入。

id username group userid phone address 
1 steve  group1  1 NULL  park aven 
2 joe   group1  2 867-5309 123 elm st 
-1

我使用的兩個表是user_和data。 希望,這可以幫助你

DECLARE 
user_name user_.username%type:='joe'; 
phone_no data.fieldresult%type; 
full_address data.fieldresult%type; 
user_id user_.id%type; 

CURSOR c_name IS select * from data; 
result c_name%rowtype; 

BEGIN 

select id into user_id from user_ where username=user_name; 
open c_name; 

LOOP 

fetch c_name into result; 

IF (result.userid=user_id AND result.fieldname='phone') THEN 
phone_no:=result.fieldresult; 
END IF; 

IF(result.userid=user_id AND result.fieldname='address') THEN 
full_address:=result.fieldresult; 
END IF; 


EXIT when c_name%NOTFOUND; 
END LOOP; 
close c_name; 

dbms_output.put_line(user_name||'  '||phone_no||'  '||full_address); 

END; 
/

OUTPUT:joe 867-5309 123 elm st

+0

爲什麼你需要在程序中做到這一點?可怕的主意明確的缺點。 – mathguy

+0

主要是我用'CURSOR',我其實不知道是'CURSOR'' PROCEDURE'還是不是?如果是的話你會介意解釋一下嗎? @mathguy –

+0

Oracle隱式地使用遊標來處理SQL語句。如果你想使用遊標,你必須在PL/SQL中執行(在過程或函數中)。重申我的問題:爲什麼需要光標來解決原始問題?Prashant在你發佈你的兩個小時前已經發布了正確的答案。你似乎還在學習。你的回答對這個主題有什麼貢獻?只有當你擁有更好,更簡單,更快速的解決方案時纔可以發佈。在你還在學習的時候,回答他人的問題並不是「猜測」的地方。 – mathguy

相關問題