2016-04-26 14 views
5

Tôi có hai bảng chứa Những người đang làm việc tại công ty và thông tin Việc làm của họ (vì vậy Mọi người là một bảng, Việc làm là một bảng khác). Bảng Mọi người chứa thông tin về nơi người đó sống, liên lạc khẩn cấp, số điện thoại bla bla bla. Bảng Employment chứa thông tin về nơi anh ta làm việc, sếp gần nhất và hơn thế nữa. Các bảng này đã bị hỏng và hiện chứa một vài bản sao do nhầm lẫn. Bây giờ trong cả hai bảng có một id Person, nhưng id việc làm chỉ nằm trong Employment. Tôi muốn cả hai con số trên tất cả mọi người đã được nhân đôi.Tham gia hủy hoại lựa chọn

này hoạt động hoàn hảo:

SELECT DISTINCT 
    pp.Personid, 
    pp.Firstname, 
    pp.Lastname, 
    pp.Address, 
FROM People pp 
JOIN People pp2 
    ON pp.Firstname = pp2.Firstname 
    AND pp.Lastname = pp2.Lastname 
    AND pp.Address = pp2.Address 
    AND pp.Personid <> pp2.Personid 
ORDER BY pp.Firstname, pp.Lastname, pp.Personid 

trở về các giá trị sau (nhưng không bao gồm số lao động như bạn có thể nhìn thấy):

1001 Carl Johnsson Bigstreet 1 
1002 Carl Johnsson Bigstreet 1 
1003 Carl Johnsson Bigstreet 1 
1010 Andrew Wilkinsson Smallstreet 2 
1011 Andrew Wilkinsson Smallstreet 2 

Bây giờ, để thêm id việc tôi tham gia trong đó bảng như thế này:

SELECT DISTINCT 
    pp.Personid, 
    e.Employmentid, 
    pp.Firstname, 
    pp.Lastname, 
    pp.Address, 
FROM People pp 
JOIN People pp2 
    ON pp.Firstname = pp2.Firstname 
    AND pp.Lastname = pp2.Lastname 
    AND pp.Address = pp2.Address 
    AND pp.Personid <> pp2.Personid 
JOIN Employment e on pp.Personid = e.Personid 
ORDER BY pp.Firstname, pp.Lastname, pp.Personid 

Và mọi thứ đều được chuyển đến h ** l trong một handbasket với r esult:

1001 1111 Carl Johnsson Bigstreet 1 
1001 1111 Carl Johnsson Bigstreet 1 
1001 1111 Carl Johnsson Bigstreet 1 
1010 1234 Andrew Wilkinsson Smallstreet 2 
1010 1234 Andrew Wilkinsson Smallstreet 2 

Như bạn có thể thấy tôi có được cả hai PersonId và Employmentid nhưng bây giờ tôi chỉ nhận được một trong mỗi (lặp đi lặp lại chính xác số lần) vì vậy tôi không có tất cả các PersonId khác nhau và Employmentid trong danh sách của tôi .

Tại sao?

Điều gì đã xảy ra với sự tham gia của tôi đã làm hỏng bữa tiệc?

+0

Phương ngữ SQL/RDBMS nào? – Dummy00001

+0

Điều này được viết bằng MS SQL trên máy chủ MS SQL 2012. –

+0

Bạn đã kiểm tra xem một 'Person' có thể được' sử dụng' nhiều lần không? – William

Trả lời

1

Ok, hãy tạo một số dữ liệu mẫu;

CREATE TABLE #People (PersonID int, FirstName varchar(50), LastName varchar(50), Address1 varchar(50)) 

INSERT INTO #People (PersonID, FirstName, LastName, Address1) 
VALUES 
('1','Mike','Hunt','Cockburn Crescent') 
,('2','Mike','Hunt','Cockburn Crescent') 
,('3','Mike','Hunt','Cockburn Crescent') 
,('4','Connie','Lingus','Dyke Close') 
,('5','Connie','Lingus','Dyke Close') 
,('6','Eric','Shun','Tickle Avenue') 
,('7','Ivana','Humpalot','Bottom Street') 

CREATE TABLE #Employment (PersonID int, EmploymentID int) 

INSERT INTO #Employment (PersonID, EmploymentID) 
VALUES 
('1','10') 
,('2','11') 
,('3','12') 
,('4','13') 
,('5','14') 
,('6','15') 
,('7','16') 

Tôi sẽ thực hiện truy vấn đầu tiên một cách khác nhau, nếu bạn thực hiện các mục trùng lặp trong một lựa chọn phụ sẽ dễ dàng hơn, bạn sẽ có thể tham gia vào bảng việc làm mà không gặp vấn đề gì;

SELECT pp.PersonID 
    ,em.EmploymentID 
    ,pp.FirstName 
    ,pp.LastName 
    ,pp.Address1 
FROM #People pp 
JOIN (
    SELECT FirstName 
     ,LastName 
     ,Address1 
     ,COUNT(1) records 
    FROM #People 
    GROUP BY FirstName 
     ,LastName 
     ,Address1 
    HAVING COUNT(1) > 1 
    ) pp2 ON pp.FirstName = pp2.FirstName 
    AND pp.LastName = pp2.LastName 
    AND pp.Address1 = pp2.Address1 
LEFT JOIN #Employment em ON pp.PersonID = em.PersonID 

Nhớ dọn dẹp các bảng tạm thời;

DROP TABLE #People 
DROP TABLE #Employment 
+1

Điều này giải quyết được vấn đề của tôi rất nhiều! Vẫn còn hơi tò mò về lý do tại sao phiên bản của tôi không hoạt động ... –

+0

EH !? DIDNT này giải quyết vấn đề của tôi. Nó chỉ giải quyết nó trên một vài ... ??? –

+0

Ok, cập nhật câu hỏi bằng dữ liệu cho người dùng không hiển thị như bạn mong đợi. Hiển thị cho chúng tôi tất cả các cột trong Mọi người và tất cả các cột trong Việc làm với dữ liệu cho một người dùng. Chúng tôi sẽ có thể làm việc đó từ đó. –

0

Tôi nghĩ bạn nên thử loại này

SELECT DISTINCT 
      ep.Personid, 
      ep.Employementid, 
      ep.FirstName, 
      ep.LastName, 
      ep.Address 
FROM Person P join 
(SELECT 
    pp.Personid, 
    e.Employmentid, 
    pp.Firstname, 
    pp.Lastname, 
    pp.Address, 
from PP 
JOIN Employment e on pp.Personid = e.Personid) ep 
on 
    P.Firstname = ep.Firstname 
    AND P.Lastname = ep.Lastname 
    AND P.Address = ep.Address 
    AND P.Personid <> ep.Personid 
ORDER BY P.Firstname, P.Lastname, P.Personid 

Sir xin vui lòng kiểm tra và trả lời cho tôi

+0

Tướng này có cùng vấn đề với bảng thứ hai của riêng tôi, tức là Personid lặp lại mà không thay đổi. –

0

Mã của bạn nên làm việc và tôi không thể mô phỏng sự cố của bạn sử dụng dữ liệu tôi đã thực hiện lên. Kết quả bạn đang thấy gợi ý với tôi rằng có nhiều id người cho carl johnsson trong bảng việc làm và rằng jobid là khác nhau - mặc dù nó trông giống nhau ở đầu ra. Bạn có thể cung cấp các định nghĩa bảng và dữ liệu mẫu của mình không?

Các vấn đề liên quan