我正在尝试从一个表格中获取数据,varchar
并将其传递给具有与 int 相同字段的其他查询。
Article
具有以下字段的表
(ArticleID int, ArticleTitle nvarchar(200), ArticleDesc nvarchar(MAX))
样本数据
1 Title1 Desc1
2 Title2 Desc2
3 Title3 Desc3
我有另一个名为横幅的表,其中包含与文章相关的横幅
(BannerID int, BannerName nvarchar(200), BannerPath nvarchar(MAX), ArticleID varchar(200))
样本数据
**BannerID BannerName BannerFile ArticleID**
100 Banner1 BannerPath1 '1','3','5'
101 Banner2 BannerPath2 '2','3','5'
102 Banner3 BannerPath3 '8','3','5'
103 Banner4 BannerPath4 '10','30','5','2','3','5'
示例查询
SELECT ArticleTitle
FROM Article
WHERE CAST(ArticleID AS varchar(200)) IN (
SELECT ArticleID FROM Banner WHERE BannerID = 2
)
在我的实际项目中,我在横幅表中有多个字段,以便我可以分配横幅文章、作者、类别、页面。出于这个原因,我决定以这种格式将 ArticleID 或 WriteID 或 CatID 存储为单个字段'10','30','5','2','3','5'
我改变了我的结构,然后我最终可能会为一个横幅创建数百条记录,并且可以将一个横幅分配给其中的任何一个article, writer, Category, Pages
下面的查询返回零行可能是我的转换正在造成问题我将不胜感激如何在不更改数据库结构的情况下解决这个问题
SELECT ArticleTitle FROM Article WHERE CAST(ArticleID AS varchar(200)) IN (SELECT ArticleID FROM Banner WHERE BannerID = 2)
更新:
对我决定坚持我的设计的任何人都没有冒犯,因为我提出的问题是针对网站的支持报告部分,该部分不会经常使用。关于不规范化表格我可能是错的......
我的实际场景假设用户访问url
`abc.com/article/article.aspx?articleID=30&CatID=10&PageID=3&writerID=3`
基于这个 url,我可以运行四个查询UNION
来获得所需的横幅,我必须决定横幅优先级,所以我会这样做
`SELECT BannerName, BannerImage FROM Banner WHERE ArticleID LIKE '%''30''%'`
UNION ALL
`SELECT BannerName, BannerImage FROM Banner WHERE CategoryID LIKE '%''10''%'`
UNION ALL
`Another query .......`
如果我这样做,那么查询将不得不在单个表中查找带有几行的横幅但是如果我根据JW
哪种方法来规范化表,则可能会导致不同表中的每个横幅有 30-40 行,这可能会影响性能,因为我必须为新文章(新杂志问题)添加新横幅。
我知道我违反了规范化的每一条法则,但我担心我必须为了性能而这样做,因为我可能最终每 100 个横幅就有 2000 行,而且这会随着时间的推移而增长。
再次更新
我希望这张图片能让您全面了解我正在尝试做的事情
如果我这样做,那么每个横幅只需要 1 行,如果我进一步规范化并创建更多表格,那么我可能最终会为一个横幅设置几行,例如从横幅表中获取上面的图像样本,那么我的第一个横幅将有 27行第二横幅 11 行第三横幅 14 行。
为了避免这种情况,我想在他们尊重的字段中存储多个 articleID、IssueID、PageID ....。这种方法可能很脏,但它正在工作。
我肯定有一些-ve 反馈,从他们的角度来看是可以理解的。由于我提供了更多详细信息,因此我的方法完全不专业,或者请记住,网站可能有很好的流量并且这种方法可能更快。