2013-03-08 89 views
0

假设我有一个主表产品,另一个表保留列表产品ID。现在如何查找ID不在主ID表

Table name: Products 
-------------------- 
ProductID, Title, Price 
     1, Title 1, 12.00 
     2, Title 2, 15.00 
     4, Title 4, 11.50 
     8, Title 8, 13.89 
     11, Title 11, 12.00 

    Table name: ListOfProducts 
     -------------------------- 
     SomeID, ProductIDs 

     34, 4,8,1 
     35, 8,10,2 

,你可以看到,在表ListOfProducts,纪录SomeID=35,产品列表是8,10,2。如何使用SQL快速找出无效的ProductID 10,因为它不在主表产品中?

我的程序实际上是在经典ASP(遗留),并且数据库在MS SQL中。我可以在ASP中循环遍历ListOfProducts中的记录,但是如何使用快速SQL来查找任何无效的ProductID?在这种情况下,当程序循环记录35时,脚本应该返回ProductID 10

这看起来很简单。但我想不出一个好的解决方案。这可以做到吗? 请帮忙!

谢谢。

+1

读为MySQL的FIND_IN_SET()'。 – 2013-03-08 02:10:15

+0

我实际上使用MS SQL。 MS SQL中是否有类似的功能?无论如何,我是这个新手,一些代码示例会很棒。谢谢。 – 2013-03-08 02:15:08

+0

据我所知,MS-SQL没有原生分割功能。 – 2013-03-08 02:18:39

回答

1

您不应该将ID存储为逗号分隔列表,这看起来更像是一个多对多的关系。你应该有一个像表:

SomeID | ProductID 
------------------- 
34  | 4 
34  | 8 
34  | 1 
35  | 8 
35  | 10 
35  | 2 

如果你真的必须使用逗号分隔的列表,那么你需要建立某种形式的split function

+0

不幸的是,ProductIDs目前存储在一个列表中。 – 2013-03-08 02:12:38

+2

这没问题,解析列表并将其放入表中。不要仅仅因为'这样做'就不会进行糟糕的设计,除非当然没有其他选择。没有数据库管理员会建议您在单个字段中存储列表。你看到的是一个坏设计的创可贴!快速解决穷人的正常化问题。 – 2013-03-08 02:25:43

+0

我真的别无选择,只能继续使用它,因为这是更大程序的一部分。 – 2013-03-08 07:37:20