none
求解决 sql in 的问题 RRS feed

  • 问题

  • 产品表 :

                ID   Name  NodeID

                1     名称      1

                .........................

               ...........................

     

    分类表  

             NodeID,  ClassName, parentID,   arrChildID(所有子节点的ID数组)

             1           分类名称            0                  1

             2           分类名称            1                   2,3,4,5

             3           分类名称            2                    3,4,5

             4           分类名称            3                    4,5

             5           分类名称            4                    5

     

    1、分类表中 如果 2 低下有上万个分类, 它们的ID都会被记录在 2 行的 arrChildID 里面

     

    2、  在添加产品的时候,我会让它先选所属那个分类

     

    3、 添加完成后,在查询的时候 我是这么写的 

          比如要查询 分类2 下面的产品

           string  strArr = 第二行的 arrChildID 字段的值 ( 2,3,4,5)

          select * from 产品表 NodeID in (strArr)

     

     可是如果当 第二行的 arrChildID 字段的值  超过上万个情况就不是很好了

     

       一个是 in 超过 1000 个以上就会报语法错误, 还有一个是效率的问题,查询的特别慢,

     

    各位高手帮帮忙

    2011年3月25日 8:19

答案

  • arrChildID--分類表這個字段,不便於維護,可以記錄OrderNr每層的順序

    在產品里可直接用一個分類字段記錄,如果是1對多分類時,用一個關系表

     

    select * from 产品表 NodeID in (strArr)

    少了where條件

    這個改用條件 like 或 charindex/patindex

    如:

    select * from 产品表 where ','+strArr+',' like '%'+rtrim( NodeID)+'%'


    ROY WU(吳熹)
    • 已标记为答案 Ai-hua Qiu 2011年4月3日 10:45
    2011年3月29日 2:59
    版主

全部回复

  • 这个是设计思路问题。

    正确的做法是将arrChildID 字段 单独设计一个表,2个字段,NodeID,arrChildID,每行记录一个对应关系。

    查询的时候做inner join即可。

     


    family as water
    2011年3月25日 14:00
  • arrChildID--分類表這個字段,不便於維護,可以記錄OrderNr每層的順序

    在產品里可直接用一個分類字段記錄,如果是1對多分類時,用一個關系表

     

    select * from 产品表 NodeID in (strArr)

    少了where條件

    這個改用條件 like 或 charindex/patindex

    如:

    select * from 产品表 where ','+strArr+',' like '%'+rtrim( NodeID)+'%'


    ROY WU(吳熹)
    • 已标记为答案 Ai-hua Qiu 2011年4月3日 10:45
    2011年3月29日 2:59
    版主
  • 你好 中国风 我按照你提供的例子

       这样写的 ',1920,'  like '%'+rtrim(N.NodeID)+'%'

     

    如果strArr 是1920 或着大于100 的数字, 查到的结果 有NodeID 是 92 的,也有是920的,和20的,

     

    这个时候我只想查出 NodeID 是1920的,请问怎么处理?

     

    谢谢!

    2011年4月10日 2:48
  • 你好,xiawei_hi 用户奖牌用户奖牌用户奖牌用户奖牌用户奖牌

    在条件字符里那里加上引号

     ',1920,' like '%,'+rtrim(N.NodeID)+',%'
    
    or
    
    patindex('%,'+rtrim(N.NodeID)+',%',','+strArr+',')>0
    
    or
    
    charindex(','+rtrim(N.NodeID)+',',','+strArr+',')>0
    
    

    ROY WU(吳熹
    2011年4月10日 16:24
    版主
  • 如果 数字多了还是报 错

     

    错误

    字符串 '38,66,67,68,70,71,72,73,74,75,76,77,78,80,81,82,83,84,85,86,87,88,90,91,92,93,94,95,96,97,99,100,101,102,103,104,105,106,107,108,109,110,112,113,114,115,116,118,119,120,121,122,124,125,126,127,128,129,130,132,133,134,135,65,69,79,89,98,111,117,123,131,137,138,139,140,141,142,143,144,146,147,148,150,151,152,153,155,156,157,158,159,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177,178,180,181,182,183,184,185,187,188,189,190,191,193,194,195,196,197,198,199,979,201,202,203,204,205,206,207,208,136,145,149,154,160,170,179,186,200,210,211,212,213,214,215,216,217,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,254,255,256,257,258,259,260,261,262,263,264,265,267,268,269,270,271,272,273,274,275,277,278,279,280,282,283,284,285,286,287,289,290,291,292,293,294,209,218,234,253,266,276,281,288,296,297,298,299,300,301,302,304,305,306,307,308,309,310,311,313,314,315,316,317,318,319,320,322,323,324,325,327,328,329,330,331,332,334,335,336,337,338,339,340,342,343,344,345,347,348,349,350,351,352,353,354,355,295,303,312,321,326,333,341,346,357,358,359,360,361,362,363,365,366,367,368,369,370,371,373,374,375,376,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,394,395,397,398,399,400,401,402,356,364,372,377,393,396,404,405,406,407,408,409,410,412,413,414,415,416,417,418,420,421,422,423,424,425,426,428,429,430,431,433,434,435,436,438,439,440,441,469,472,473,474,447,448,449,450,451,452,453,455,456,457,459,460,461,462,463,464,466,467,468,403,411,419,427,432,437,446,454,465,476,477,478,479,480,481,482,484,485,486,487,488,490,491,492,493,495,496,497,498,499,500,502,503,504,505,506,507,508,509,511,512,513,514,515,516,517,518,519,521,522,523,524,525,526,527,528,530,531,532,533,534,535,536,537,538,540,541,542,543,544,545,546,547,549,550,551,552,553,555,556,557,559,560,561,562,563,564,565,566,475,483,489,494,501,510,520,529,539,548,554,558,568,569,570,571,572,573,574,575,577,578,579,580,581,582,583,584,586,587,588,589,590,591,592...
    '38,66,67,68,70,71,72,73,74,75,76,77,78,80,81,82,83,84,85,86,87,88,90,91,92,93,94,95,96,97,99,100,101,102,103,104,105,106,107,108' 附近有语法错误。
    ',' 附近有语法错误。
    PR_Common_GetListBySortColumn过程试图返回状态 NULL,这是不允许的。将返回状态 0。

     


     

     


    2011年4月10日 17:03