2016-01-18 83 views
-1

我有SQL表生成的3列由ERP。查询SQL查询的常见属性

+-----------+-----------+------------+ 
| ProductID | Attribute | Value | 
+-----------+-----------+------------+ 
|  100 | Size  | Big  | 
|  100 | Color  | Red  | 
|  100 | Weight | Heavy  | 
|  200 | Size  | Small  | 
|  200 | Color  | Red  | 
|  200 | Weight | Light  | 
|  300 | Size  | Big  | 
|  300 | Color  | Green  | 
|  300 | Weight | Heavy  | 
+-----------+-----------+------------+ 

我想要查询表以查找具有匹配属性的产品。例如

SELECT * FROM Table 
WHERE Attribute ='Size' AND Value = 'Big' AND Attribute ='Weight' AND Value = 'Heavy' 

所以退回产品100和300

+2

您还没有解释“找到具有匹配属性的产品”的含义:什么是输入?就这张表,还是其他的一些,还是一些参数/常量?为什么在您要求查询时提供查询?期望的查询应该是什么样的?根据输入,输出应该是什么样子?请举例输入和输出。 PS为什么两个不同的DBMS标签? – philipxy

+0

MySQL和/或MS SQL Server? (不要标记不涉及的产品...) – jarlh

回答

1

另一种方法是使用传统的“数据透视查询”并将其视为“派生表”,然后将大小/重量/颜色作为行进行筛选。

SQL Fiddle

的MySQL 5.6架构设置

CREATE TABLE ERPout 
    (`ProductID` int, `Attribute` varchar(6), `Value` varchar(5)) 
; 

INSERT INTO ERPout 
    (`ProductID`, `Attribute`, `Value`) 
VALUES 
    (100, 'Size', 'Big'), 
    (100, 'Color', 'Red'), 
    (100, 'Weight', 'Heavy'), 
    (200, 'Size', 'Small'), 
    (200, 'Color', 'Red'), 
    (200, 'Weight', 'Light'), 
    (300, 'Size', 'Big'), 
    (300, 'Color', 'Green'), 
    (300, 'Weight', 'Heavy') 
; 

查询1

SELECT 
     ProductID 
    , Size 
    , Color 
    , Weight 
FROM (
     SELECT 
      ProductID 
      , MAX(CASE WHEN Attribute = 'Size' THEN VALUE END) AS Size 
      , MAX(CASE WHEN Attribute = 'Color' THEN VALUE END) AS Color 
      , MAX(CASE WHEN Attribute = 'Weight' THEN VALUE END) AS Weight 
     FROM ERPout 
     GROUP BY 
      ProductID 
    ) p 
WHERE Size = 'Big' 
     AND Weight = 'Heavy' 

Results

| ProductID | Size | Color | Weight | 
|-----------|------|-------|--------| 
|  100 | Big | Red | Heavy | 
|  300 | Big | Green | Heavy | 
+0

老兄,它的工作更好。非常感谢好友。你是一个拯救生命的人。 –

0

有几种不同的方式来做到这一点。这里使用条件聚集一个是:

select productid 
from yourtable 
group by productid 
having max(case when attribute = 'Size' then value end) = 'Big' 
    and max(case when attribute = 'Weight' then value end) = 'Heavy' 
1

可以使用做一个条件SUM

SELECT ProductID 
FROM tbl 
GROUP BY ProductID 
HAVING 
    SUM(
     CASE 
      WHEN Attribute = 'Size' AND Value = 'BIG' THEN 1 
      WHEN Attribute = 'Weight' AND Value = 'Heavy' THEN 1 
      ELSE 0 
     END 
    ) = 2 

您可以使用>= 2如果你想ProductID s的其他属性。

0

我相信你想要的产品对。此外,我并没有对任何地方的值进行硬编码。如果您需要更改属性集,请修改having子句。

select t1.ProductID, t2.ProductID 
from 
    T t1 inner join T t2 
     on  t2.ProductID > t1.ProductID 
      and t2.Attribute = t1.Attribute and t2.Value = t1.Value 
group by 
    t1.ProductID, t2.ProductID 
having 
     count(case when t1.Attribute = 'Size' then 1 end) = 1 
    and count(case when t1.Attribute = 'Weight' then 1 end) = 1 

我有点想回答像费利克斯的答案是你想要的。

+0

谢谢@ shawnt00 –

0

如果你只需要的ProductID,这将是一个高效短sollution:

SELECT ProductID 
FROM product_info 
WHERE Attribute ='Size' AND Value = 'Big' 
    OR Attribute ='Weight' AND Value = 'Heavy' 
GROUP BY ProductID 
HAVING COUNT(ProductID) = 2 

如果你需要在一排所有属性和已定义的(唯一/主)上(的ProductID键,属性),你可能想使用这样的查询:

SELECT size.ProductID, size.Value Size, color.Value Color, weight.Value Weight 
FROM product_info size 
JOIN product_info weight USING(ProductID) 
LEFT JOIN product_info color 
    ON color.ProductID = size.ProductID 
    AND color.Attribute = 'Color' 
WHERE size.Attribute = 'Size' AND size.Value = 'Big' 
    AND weight.Attribute = 'Weight' AND weight.Value = 'Heavy' 

如果您另外定义上的索引,性能会更好。

这两个查询都使用WHERE子句避免完整的表/索引扫描。根据表格大小和数据,这可能是一个巨大的优势,因为早期的过滤。