如何编写高效的sql查询来从多个表中进行选择?

时间:2011-09-10 14:08:54

标签: c# asp.net sql-server-2008

好的,我有三张桌子。父表是Listings和两个子表ImagesTags

这是数据库架构

列表

ListingID (PK)      Title                     Images          Tags
1                   Fruits                    1               1
2                   Furniture                 0               0
3                   Electronics               0               0

图片表

ImageID        ListingID (FK)              ImageName
1              1                           fruits.png
2              1                           fruits_2.png
3              1                           fruits_3.png

代码

TagID          ListingID (FK)               Tag
1              1                            apple
2              1                            banana
3              1                            melon

所以我需要通过listingid从列表中选择,如果它有图像连接图像表,如果它有标签表。

作为输出我想收到

例如,我选择清单ID = 1

Title            Images                                    Tags
---------------------------------------------------------------------------
Fruits           fruits.png|fruits_2.png|fruits_3.png      apple|banana|melon

请记住,Listing表每天有100K次点击。所以我们需要消除行锁定

如果您更好地了解如何从这3个表格中选择,请与我分享示例。

2 个答案:

答案 0 :(得分:3)

您也可以

SELECT l.Title, i.ImageName, t.Tag FROM
    Listings l
    LEFT OUTER JOIN Images i ON l.ListingID = i.ListingID
    LEFT OUTER JOIN Tags t ON l.ListingID = t.ListingID
WHERE l.ListingID = 1

您必须按下生成结果集,但在我的工作中,我更喜欢将纯SQL与应用程序逻辑分开。

答案 1 :(得分:2)

select p.Title, 
stuff((select ', ' + i.ImageName from Images i where i.ListingID = p.ListingID for xml path('')),1,2,'') as Images,
stuff((select ', ' + t.Tag from Tags t where t.ListingID = p.ListingID for xml path('')),1,2,'') as Tags
from Listing p

有关实现目标的可能选项的进一步参考,请参阅http://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/

但我建议使用3个简单的SELECT并在客户端构建所需的字符串......