SQL:选择具有唯一值但所有列的行
我有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的行? 谢谢
更新:我删除了我以前的答案,因为它不再是相关
没关系啊,这应该这样做。请注意,对于此完整示例,我正在使用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.如果表格名称是英文的,则是“附件”而不是“附件”。如果是用另一种语言,那就不要理我! :)
不幸的是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
从电子邮件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)
我不好,我说不清楚。 该死的,我写了它反之亦然。这些列包含父表(EMAILS),而不是附件。 – Snake 2010-02-10 10:10:57