2010-02-10 106 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)

相关问题