【问题标题】:SQL - comparing attributes across columnsSQL - 跨列比较属性
【发布时间】:2014-07-16 18:18:33
【问题描述】:

我有以下表格

customers(custid, name)
orders(orderid, custid)
itemsordered(itemid, orderid)
items(itemid, description)

我的目标是让每对客户都订购了具有相同描述的商品,检索这两个客户的姓名。消除重复,不要将客户与他们自己配对,并且每对只包含一次。对于每一对,按字母顺序返回该对中的名称。

我知道我需要引用两个 custid 并将它们的描述相互比较,例如:

select nameA
from customers nameA
join orders using (custid)
join itemsordered using (orderid)
join item using (itemid)
where (select nameB
from customers
from customers nameA
join orders using (custid)
join itemsordered using (orderid)
join item using (itemid)
where descriptionA = descriptionB

etc.

但我不确定如何进行。正确答案如下:

Christina|Janine
Christina|Max
Christina|Teddy
Christina|David
Christina|Rachel
Rachel|Teddy
David|Janine
David|Rachel
David|Teddy
Janine|Rachel
Janine|Teddy
Janine|Max
Max|Teddy

我需要一些新的例子。我的大部分猜测都包含如下子查询:

select attribute from table
join anotherTable using (somekey)
where table in (select anotherAttribute 
from anotherTable
where....etc.

任何建议或方向将不胜感激。

更新:名称是唯一的。

【问题讨论】:

  • 名字是唯一的吗?如果不是,则输出不明确...
  • 名称是唯一的。说明已更新。

标签: sql postgresql


【解决方案1】:
WITH t AS (
    SELECT DISTINCT c.name, i.description  -- collapse dupes per name
    FROM   customers    c
    JOIN   orders         USING (custid)
    JOIN   itemsordered   USING (orderid)
    JOIN   items        i USING (itemid)
    )
SELECT DISTINCT t.name, t1.name
FROM   t
JOIN   t t1 USING (description)
WHERE  t.name < t1.name    -- rules out self-joins and duplicate pairs
ORDER  BY 1, 2;

这与@Clodoaldo 发布的内容相似,但有几个重要区别。

  • 假设名称是唯一的。否则结果将毫无意义。更简单的外部SELECT.
    如果名称不唯一,则需要输出custid(附加)。

  • 根据问题匹配description

  • 立即折叠每个客户的重复描述。只有很少的欺骗,这将无济于事。有了更多,它可以提高性能。

【讨论】:

【解决方案2】:
with s as (
    select *
    from
        customers
        inner join
        orders using (custid)
        inner join
        itemsordered using (orderid)
        inner join
        items using (itemid)
)
select distinct
    least(s1.name, s2.name),
    greatest(s1.name, s2.name)
from
    s s1
    inner join
    s s2 on
        s1.description = s2.description
        and
        s1.custid < s2.custid
order by 1, 2

【讨论】:

  • 项目描述必须相同,而不是itemid。此外,将项目更改为项目。全部更新。不过,这很好用。谢谢你。非常清晰的解决方案 - 我将采用有趣的格式。
  • @piofusco 你的意思是有不止一个 itemid 具有相同的描述?它们是同一个项目吗?如果是,则应删除其中之一。
  • 具有相同描述的 itemid 不止一个。然而,它们是不同的项目。每个项目也有一个颜色属性,但我没有包括这个以避免混淆。
猜你喜欢
  • 2017-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-05
  • 1970-01-01
相关资源
最近更新 更多