SQL子查询和CAST无法正常工作

Lea*_*ing 1 sql-server asp.net join sql-server-2008

我试图从一个表格中获取数据,varchar并将其传递给与int具有相同字段的其他查询.

表格 Article包含以下字段

(ArticleID int, ArticleTitle nvarchar(200), ArticleDesc nvarchar(MAX))

样本数据

1 Title1 Desc1
2 Title2 Desc2
3 Title3 Desc3
Run Code Online (Sandbox Code Playgroud)

我有另一个名为Banner的表,其中包含与文章相关的横幅

(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'
Run Code Online (Sandbox Code Playgroud)

示例查询

SELECT ArticleTitle 
FROM Article 
WHERE CAST(ArticleID AS varchar(200)) IN (
    SELECT  ArticleID FROM Banner WHERE BannerID = 2
)
Run Code Online (Sandbox Code Playgroud)

在我的实际项目中,我在横幅表中有多个字段,以便我可以分配横幅文章,编写者,类别,页面.因此我决定将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)
Run Code Online (Sandbox Code Playgroud)

更新:

我决定坚持我的设计没有任何冒犯,因为我问过的问题是网站的支持报告部分,这些部分不会经常使用.关于不规范化表格我可能是错的......

我的实际场景假设用户访问url

`abc.com/article/article.aspx?articleID=30&CatID=10&PageID=3&writerID=3`
Run Code Online (Sandbox Code Playgroud)

根据这个网址,我可以运行四个查询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 .......`
Run Code Online (Sandbox Code Playgroud)

如果我这样做,那么查询将不得不在单个表中查找具有少量行的横幅但是如果我根据JW哪种方式对表进行规范化,那么可能会导致不同表中每个横幅的30-40行可能会影响因为我必须为新文章添加新的横幅(针对新的杂志问题).

我知道我打破了正常化的每一个规律,但我担心我必须为表现而做,因为我可能最终每100个横幅有2000行,这将随着时间的推移而增长.

再次更新

我希望这张图片可以让你了解我想要做的事情

在此输入图像描述

如果我这样做,那么我每个横幅只需要1行&如果我进一步规范化并创建更多表格,那么我可能最终会为一个横幅设置几行例如从横幅表中获取上面的图像样本然后我的第一个横幅将有27个行第二横幅11行三分行横幅14行.

为了避免这种情况,我想到在他们尊重的字段中存储多个articleID,IssueID,PageID .... 这种方法可能很脏但是有效.

我绝对有一些反馈,从他们的角度来看是可以理解的..因为我提供了进一步的细节,我的方法完全不专业或者很好,记住网站可能有非常好的流量,这种方法可能更快.

Joh*_*Woo 6

当您在搜索记录时使用这些值时,在列中保存逗号分隔值时,这是一个非常糟糕的设计.

你需要正确地规范化并将表重组为3表设计,因为我可以看到和Many-to-Many之间的关系.ArticleBanner

建议的架构设计:

文章表

  • ArticleID(PK)
  • ArticleTitle
  • ArticleDesc

横幅表

  • BannerID(PK)
  • BannerName
  • BannerPath

Article_Banner表

  • ArticleID(FK)(也是具有BannerID的复合PK)
  • BannerID(FK)

通过这种设计,您可以简单地查询您的记录,如:

SELECT  a.*
FROM    Article a
        INNER JOIN Article_Banner b
            ON a.ArticleID = b.ArticleID
WHERE   b.BannerID = 2
Run Code Online (Sandbox Code Playgroud)

结构的优点:

  • 可以轻松创建查询语句
  • 可以利用定义的索引
  • 等等..