2010-02-10 118 views
2

我有2個表:附件和電子郵件(模擬示例)。 ATTACHEMENTS表保存每一行的引用ID到它所屬的電子郵件。另外我的電子郵件可以有0個或更多的附件。SQL:選擇具有唯一值但所有列的行

表的樣子:

Emails 
    UID Column1, Column2 ...up to 20 columns 
    1  
    2  
    3  
    4  

Attachements 
    UID  ReferenceID //link to EMAILS.UID 
    1  2 //this and the one below belong to the same parent. 
    2  2 
    3  1 
    4  3 

現在,我需要找回所有電子郵件與attachement,不管他們有多少。 我需要獲取所有列,所以我想我不能使用不同的,但我只需要具有不同referenceID的行。從上面的表中,我將需要有結果3. 簡而言之:如何選擇所有列,但具有不同referenceID的行? 謝謝

回答

0

更新:我刪除了我以前的答案,因爲它不再是相關

沒關係啊,這應該這樣做。請注意,對於此完整示例,我正在使用Microsoft SQL Server表變量,只需將select語句更改爲使用「電子郵件」&「Attachements」而不是「@Emails」&「@Attachements」即可。

DECLARE @Emails TABLE 
(
    [UID] INT, 
    [Column1] VARCHAR(20), 
    [Column2] VARCHAR(20), 
    [Column3] VARCHAR(20), 
    [Column4] VARCHAR(20), 
    [Column5] VARCHAR(20) 
) 

DECLARE @Attachements TABLE 
(
    [UID] INT, 
    [ReferenceID] INT 
) 

INSERT INTO @Emails ([UID], Column1, Column2, Column3, Column4, Column5) SELECT 1, 'Data 1', 'Data 2', 'Data 3', 'Data 4', 'Data 5' 
INSERT INTO @Emails ([UID], Column1, Column2, Column3, Column4, Column5) SELECT 2, 'Data 6', 'Data 7', 'Data 8', 'Data 9', 'Data 10' 
INSERT INTO @Emails ([UID], Column1, Column2, Column3, Column4, Column5) SELECT 3, 'Data 11', 'Data 12', 'Data 13', 'Data 14', 'Data 15' 
INSERT INTO @Emails ([UID], Column1, Column2, Column3, Column4, Column5) SELECT 4, 'Data 16', 'Data 17', 'Data 18', 'Data 19', 'Data 20' 

INSERT INTO @Attachements ([UID], [ReferenceID]) SELECT 1, 2 
INSERT INTO @Attachements ([UID], [ReferenceID]) SELECT 2, 2 
INSERT INTO @Attachements ([UID], [ReferenceID]) SELECT 3, 1 
INSERT INTO @Attachements ([UID], [ReferenceID]) SELECT 4, 3 

-- And here's the select! 
SELECT e.UID, e.Column1, e.Column2, e.Column3, e.Column4, e.Column5 
FROM @Emails e 
WHERE EXISTS 
    (SELECT 1 FROM @Attachements a WHERE a.ReferenceID = e.UID) 

你也可以用一個內部JOIN做一個DISTINCT,儘管我更喜歡上面的個人風格。我不確定哪個更有效。

SELECT DISTINCT e.UID, e.Column1, e.Column2, e.Column3, e.Column4, e.Column5 
FROM @Emails e 
    INNER JOIN @Attachements a ON a.ReferenceID = e.UID 

P.S.如果表格名稱是英文的,則是「附件」而不是「附件」。如果是用另一種語言,那就不要理我! :)

+0

我不好,我說不清楚。 該死的,我寫了它反之亦然。這些列包含父表(EMAILS),而不是附件。 – Snake 2010-02-10 10:10:57

1

不幸的是DISTINCT沒有說什麼。因此,要檢索不同的ID,您將如何確定從關係中選擇哪個「其他」列值?

還是你想檢索只有ID?您可以嘗試通過選擇領帶的第一行/最後一行來檢索關係中的詳細信息。

爲此,您可以嘗試像

DECLARE @Table TABLE(
     UID INT IDENTITY(1, 1), 
     ReferenceID INT, 
     Col1 VARCHAR(10), 
     Col2 VARCHAR(10), 
     Col3 VARCHAR(10), 
     Col4 VARCHAR(10) 
) 

INSERT INTO @Table (ReferenceID,Col1, Col2, Col3, Col4) SELECT 2, 1, 1, 1, 1 
INSERT INTO @Table (ReferenceID,Col1, Col2, Col3, Col4) SELECT 2, 2, 2, 2, 2 
INSERT INTO @Table (ReferenceID,Col1, Col2, Col3, Col4) SELECT 3, 3, 3, 3, 3 
INSERT INTO @Table (ReferenceID,Col1, Col2, Col3, Col4) SELECT 4, 4, 4, 4, 4 

SELECT t.* 
FROM @Table t INNER JOIN 
     (
      SELECT ReferenceID, 
        MAX(UID) MUID 
      FROM @Table 
      GROUP BY ReferenceID 
     ) mID ON t.ReferenceID = mID.ReferenceID 
       AND t.UID = mID.MUID 
+0

Err.there沒有20個referenceIDs。只有referenceID和其他非重要的列。對不起,它在這個問題上令人困惑。 – Snake 2010-02-10 09:24:42

+0

我需要檢索完整的行,但只有那些具有不同的ID。 PS:爲什麼這是討厭的設計?它連接表的正常方式。謝謝 – Snake 2010-02-10 09:37:10

+0

對不起,正在談論你是否有Ref1..Ref20。 – 2010-02-10 09:44:04

0

從電子郵件E選擇不同e.uid,COL1,COL2,......,col20,附件的 其中e.uid = a.referenceID

OR

選擇UID,COL1, ... ,, col20 from email e where e.uid in(select referenceid from attachments)

相關問題