2011-10-10 85 views
0

我有一个名为ProductClassification两列的表 '产品ID,ClassificationID'查询SQLite的

ProductID, ClassificationID 
10408, 1749 
10408, 1750 

一个产品ID可以有多个ClassificationID。如果我查询多个不同的ClassificationID,我将如何提取单个产品。

例如:下面的不工作

SELECT Product.ID, Product.Name FROM 
Product, ProductClassification WHERE 
ProductClassification.ClassificationID = '1750' AND 
ProductClassification.ClassificationID = '1749' 
+0

谢谢你们所有帮助我的答案。 “Dano”谢谢你为我分手,帮了我很多。 “德姆”我最终使用你的程序。 – Peter

回答

1
  • WHERE子句对记录的基础记录检查。
  • 在单个记录中,ClassificationID不能是17501749
  • 将此更改为1750 OR 1749允许eahc个人记录过滤。
  • 然后你需要检查任何一个Product.ID这两个记录通过。


SELECT 
    Product.ID, 
    Product.Name 
FROM 
    Product 
INNER JOIN 
    ProductClassification 
    ON Product.ID = ProductClassification.ProductID 
WHERE 
    ProductClassification.ClassificationID = '1750' OR 
    ProductClassification.ClassificationID = '1749' 
GROUP BY 
    Product.ID, 
    Product.Name 
HAVING 
    COUNT(DISTINCT ProductClassification.ClassificationID) = 2 
1

你想要一个ORIN条款(不知道是否SQLLite支持与否)。

正在写入的查询正在寻找相同字段中的两个值,该记录不可能是

尝试:

SELECT Product.ID, Product.Name FROM 
Product, ProductClassification WHERE 
ProductClassification.ClassificationID = '1750' OR 
ProductClassification.ClassificationID = '1749' 

OR

SELECT Product.ID, Product.Name FROM 
Product, ProductClassification WHERE 
ProductClassification.ClassificationID IN ('1750','1749') 
1

类型此,你错过了 “内部连接” 部分 例如:

SELECT Product.ID, Product.Name FROM Product inner join ProductClassification on Product.ClassificationID = ProductClassification.ClassificationID WHERE 
ProductClassification.ClassificationID = '1750' or 
ProductClassification.ClassificationID = '1749' 
1

你似乎是新的SQL 。穿过它是很危险的。我会建议加入这些SQL语句以了解发生了什么。

SELECT * FROM Product, ProductClassification 

此时,您将从两个表中选择每个可能的行组合。现在你想开始过滤器。对于初学者,你需要获得你的产品分类。你应该在这里使用“OR”而不是AND。没有ProductClassification.ClassificationID将是既1750年到1749年

SELECT * FROM Product, ProductClassification WHERE 
ProductClassification.ClassificationID = '1750' OR 
ProductClassification.ClassificationID = '1749' 

在这一点上,你已经过滤下来ProductClassification.ClassificationID,但你需要描述你只行有意在ProductClassification.ProductID和Product.ID是相同的。

SELECT * FROM Product, ProductClassification WHERE 
(ProductClassification.ClassificationID = '1750' OR 
ProductClassification.ClassificationID = '1749') AND 
ProductClassification.ProductID = Product.ID 

这会给你一个单独的行,该过滤器上的每个可能的组合。在你的例子中,你应该有两行 - 一个是ClassificationID为1750,另一个是ClassificationID为1749.因为你只对Product.ID和Product感兴趣。名称,你应该只返回这两个领域:

SELECT Product.ID, Product.Name FROM Product, ProductClassification WHERE 
(ProductClassification.ClassificationID = '1750' OR 
ProductClassification.ClassificationID = '1749') AND 
ProductClassification.ProductID = Product.ID 

想必你只需要唯一值,这样你就可以使用“DISTINCT”操作符,将你的回油过滤器到独特的价值观:

SELECT DISTINCT Product.ID, Product.Name FROM Product, ProductClassification WHERE 
(ProductClassification.ClassificationID = '1750' OR 
ProductClassification.ClassificationID = '1749') AND 
ProductClassification.ProductID = Product.ID 

使用JOIN语句处理这个查询有很多更好的方法,但这是一个好的开始。