2013-03-04 87 views
0

我有1個查詢可以從內聯合的幫助下從三個表中獲取記錄。重複顯示記錄

table name 

tbl_emp as emp 
tbl_sal as sal 
tbl_address as addr 

fields from 3 tables 

Schema: 

tbl_emp - empid,name,comp_id 
tbl_sal - empid - emp_type 
tbl_address - emp_type 

查詢

SELECT emp.empid, emp.name, sal.salary, addr.address 
from tbl_emp as emp 
INNER JOIN tbl_sal as sal 
    ON emp.empid = sal.empid 
INNER JOIN tbl_address as addr 
    ON addr.emp_type = sal.emp_type 
where comp_id = '114'; 

結果表明:

1 abc 1000 test 
1 abc 1000 test 
1 abc 1000 test 
1 abc 1000 test 
1 abc 1000 test 
2 xyz 2500 main 
2 xyz 2500 main 
2 xyz 2500 main 
2 xyz 2500 main 
2 xyz 2500 main 

我想導致這樣的:

1 abc 1000 test 
2 xyz 2500 main 

請幫我在這。

+0

後滿的DDL表,它顯得有些領域被排斥在外。另外一些示例數據會有所幫助。 – 2013-03-04 09:57:09

回答

1

試試這個

SELECT emp.empid, 
     emp.name, 
     sal.salary, 
     addr.address 
FROM tbl_emp as emp 
INNER JOIN tbl_sal as sal 
    ON emp.empid = sal.empid 
INNER JOIN tbl_address as addr 
    ON addr.emp_type = sal.emp_type 
WHERE comp_id = '114' 
GROUP BY empid; 
+0

我會建議編輯這個,所以它很容易閱讀。而不是有一條巨大的線。 – Zane 2013-03-04 18:14:42

+0

@NaveenProgrammer我編輯你的答案爲了可讀性。 – Lamak 2013-03-04 18:17:50

+0

@Lamak先生,謝謝。 – Zane 2013-03-04 18:28:37

1

使用GROUP BY:

SELECT emp.empid,emp.name,sal.salary,addr.address from tbl_emp as emp INNER JOIN tbl_sal as sal ON emp.empid = sal.empid INNER JOIN tbl_address as addr ON addr.emp_type = sal.emp_type where comp_id = '114' 
group by emp.empid,emp.name,sal.salary,addr.address 
2

根據您的樣本數據,你應該能夠使用DISTINCT

SELECT DISTINCT emp.empid, 
    emp.name, 
    sal.salary, 
    addr.address 
from tbl_emp as emp 
INNER JOIN tbl_sal as sal 
    ON emp.empid = sal.empid 
INNER JOIN tbl_address as addr 
    ON addr.emp_type = sal.emp_type 
where comp_id = '114'; 

DISTINCT跨所有應用數據列將刪除所有重複項。你有限的樣本將允許應用這個。

您還可以使用GROUP BY來獲得結果。我的建議是,如果你申請的GROUP BY將其應用到每一個項目在SELECT列表:

SELECT emp.empid, 
    emp.name, 
    sal.salary, 
    addr.address 
from tbl_emp as emp 
INNER JOIN tbl_sal as sal 
    ON emp.empid = sal.empid 
INNER JOIN tbl_address as addr 
    ON addr.emp_type = sal.emp_type 
where comp_id = '114' 
GROUP BY emp.empid, emp.name, sal.salary, addr.address; 

MySQL使用的擴展GROUP BY它允許在選擇列表中的項目要非聚集,不包括GROUP BY子句中。但是,這可能會導致意外的結果,因爲MySQL可以選擇返回的值。 (見MySQL Extensions to GROUP BY

從MySQL的文檔:

MySQL的擴展使用GROUP BY的,這樣的選擇列表可參考在GROUP BY子句中未命名的非聚合列。 ...您可以使用此功能通過避免不必要的列排序和分組來獲得更好的性能。但是,這非常有用,因爲每個未在GROUP BY中命名的非聚合列中的所有值對於每個組都是相同的。服務器可以自由選擇每個組中的任何值,因此除非它們相同,否則所選值是不確定的。此外,每個組的值的選擇不能通過添加ORDER BY子句來影響。結果集的排序在選擇值後發生,而ORDER BY不影響服務器選擇的值。

0

DISTINCT關鍵字會做你想要什麼,這將確保重複被過濾掉

SELECT DISTINCT emp.empid,emp.name,sal.salary,addr.address from tbl_emp as emp INNER JOIN tbl_sal as sal ON emp.empid = sal.empid INNER JOIN tbl_address as addr ON addr.emp_type = sal.emp_type where comp_id = '114'; 

如果你雖然得到重複,就可能要確保您的查詢實際上做什麼你認爲它否則,如果結果集中存在真正的重複項(而不是您的查詢創建的重複項),則使用DISTINCT可能會出現問題。

0

嘗試group byemp.empid

SELECT emp.empid,emp.name,sal.salary,addr.address from tbl_emp as emp INNER JOIN tbl_sal as sal ON emp.empid = sal.empid INNER JOIN tbl_address as addr ON addr.emp_type = sal.emp_type where comp_id = '114' group by emp.empid ;