你的问题是怎么样的混乱;你想每个用户只显示一行,还是你想要显示每张图片的一行,但是抑制U.NAME字段中的重复值?我想你想要第二个;如果不是,第一个就有很多答案。
是否显示重复值是显示逻辑,SQL并非真正为此设计的。您可以在循环中使用游标来逐行处理结果,但是会失去很多性能。如果你有一种像.NET语言或者Java这样的“智能”前端语言,那么无论你把这些数据放到什么样的构造中,都可以很便宜地操作,以便在最终显示UI之前抑制重复的值。
如果您使用的是Microsoft SQL Server,并且要在数据层完成变换HAS,则可以考虑使用CTE(计算表表达式)来保存初始查询,然后从每行中选择值CTE根据前一行中的列是否保存相同的数据。它会比光标更高效,但是它会有点麻烦。观察:
USING CTE (Row, Name, PicID)
AS
(
SELECT ROW_NUMBER() OVER (ORDER BY U.NAME, P.PIC_ID),
U.NAME, P.PIC_ID
FROM USERS U
INNER JOIN POSTINGS P1
ON U.EMAIL_ID = P1.EMAIL_ID
INNER JOIN PICTURES P
ON P1.PIC_ID = P.PIC_ID
WHERE P.CAPTION LIKE '%car%'
ORDER BY U.NAME, P.PIC_ID
)
SELECT
CASE WHEN current.Name == previous.Name THEN '' ELSE current.Name END,
current.PicID
FROM CTE current
LEFT OUTER JOIN CTE previous
ON current.Row = previous.Row + 1
ORDER BY current.Row
以上示例是TSQL特定的;不保证能够像PL/SQL那样在任何其他DBPL中工作,但我认为大多数企业级SQL引擎都有类似的东西。
您想要使用单个U.NAME中的多个P.PIC_ID中的哪一个? – 2011-02-03 21:02:46