SQL - 在同一个表中查找一个属性与另一个属性的多次出现

时间:2014-07-16 18:11:41

标签: postgresql

考虑以下表格

Inventory(storeid, itemid, qty)
Items(itemid, description, size, color)

这是我的任务:检索符合以下条件的商店的ID:对于其库存中保存的每个商品描述,商店都会为该描述保留所有可能尺寸的相应商品ID。

这是响应的外观:

3667
3706
3742
3842

我在哪里:

with s as (
    select * 
    from inventory 
    inner join items using (itemID) 
),
m as (
    select count(distinct size), description
    from items
    group by description
),
sizes as (
    select distinct size
    from items
)
select distinct s1.storeID
from s s1 
    inner join m m1
    on s1.description = m1.description
    group by s1.storeID;

这只会返回storeid,其中包含与任何描述相匹配的商品...即每个商店。无法找到获取描述的方法并确保它具有所有三种尺寸(小,中,大)。

http://sqlfiddle.com/#!2/2a743e

2 个答案:

答案 0 :(得分:2)

它没有说三种尺寸,但是所有尺寸都可以,我喜欢数组:

WITH sizes AS (
    SELECT description, array_agg(DISTINCT size) AS sizes
    FROM items
    GROUP BY description
)
,store_items AS(
    SELECT s.storeID, it.description, array_agg(DISTINCT it.size) AS sizes
    FROM stores AS s
      JOIN inventory AS i 
        ON s.storeID = i.storeID
      JOIN items AS it 
        ON i.itemID = it.itemID
     GROUP BY s.storeID, it.description
)
SELECT s.storeID
FROM stores AS s
WHERE s.storeID NOT IN(
  SELECT storeID
  FROM store_items AS si     
  JOIN sizes z
    ON z.description = si.description
    AND si.sizes<>z.sizes)

fiddle

答案 1 :(得分:1)

使用having子句,我们可以找到大小为3的描述。 然后,我们计算这些描述的数量,并将其与商店中描述的总数进行比较。

WITH countofdescirptions 
     AS (SELECT i.storeid, 
                Count(DISTINCT it.description)K 
         FROM   inventory i 
                INNER JOIN items it 
                        ON i.itemid = it.itemid 
         GROUP  BY i.storeid), 
     has3  
     AS (SELECT i.storeid, 
                it.description 
         FROM   inventory i 
                INNER JOIN items it 
                        ON i.itemid = it.itemid 
         GROUP  BY i.storeid, 
                   it.description 
         HAVING Count(DISTINCT size) = 3) 
SELECT * 
FROM   countofdescirptions 
       INNER JOIN (SELECT storeid, 
                          Count(description)K 
                   FROM   has3
                   GROUP BY storeid) has3Count 
               ON countofdescirptions.storeid = has3Count.storeid 
                  AND countofdescirptions.k = has3Count.k 

DEMO

我很确定使用COUNT()OVER

的解决方案