获取表中具有相同数据的结果

时间:2013-05-05 15:31:14

标签: sql oracle

我需要获得他们的偏好MINPRICE和MAXPRICE相同的所有客户名称。

这是我的架构:

CREATE TABLE    CUSTOMER (
PHONE   VARCHAR(25) NOT NULL,
NAME    VARCHAR(25),
CONSTRAINT CUSTOMER_PKEY PRIMARY KEY (PHONE),
);

CREATE TABLE    PREFERENCE (
PHONE   VARCHAR(25) NOT NULL,
ITEM        VARCHAR(25)     NOT NULL,
MAXPRICE    NUMBER(8,2),
MINPRICE    NUMBER(8,2),
CONSTRAINT PREFERENCE_PKEY PRIMARY KEY (PHONE, ITEM),
CONSTRAINT PREFERENCE_FKEY FOREIGN KEY (PHONE) REFERENCES CUSTOMER (PHONE)
);

我想我需要在行和行之间做一些比较?或创建另一个视图进行比较?任何简单的方法吗?

它的一对多。客户可以有多个首选项,因此我需要查询具有相同minprice和maxprice的客户列表。比较行minprice = minprice和maxprice = maxprice

3 个答案:

答案 0 :(得分:0)

preference上的自我加入会找到具有相同价格偏好但行号不同的行:

select  distinct c1.name
,       p1.minprice
,       p1.maxprice
from    preference p1
join    preference p2
on      p1.phone <> p2.phone
        and p1.minprice = p2.minprice
        and p1.maxprice = p2.maxprice
join    customer c1
on      c1.phone = p1.phone
join    customer c2
on      c2.phone = p2.phone
order by
        p1.minprice
,       p1.maxprice
,       c1.name

答案 1 :(得分:0)

您的偏好表中有minprice和maxprice似乎很奇怪。这是您在每次交易后更新的表格,以便每个客户只有1个有效的首选项记录吗?我的意思是,它看起来像客户可以为同一项目支付两种不同的价格,这看起来很奇怪。

假设客户和偏好是1:1

SELECT c.*
FROM customer c INNER JOIN preference p ON c.phone = p.phone
WHERE p.minprice = p.maxprice

但是,如果客户可以有多个首选项,并且您正在为所有项目寻找minprice = maxprice ...那么您可以这样做

SELECT c.*
FROM (SELECT phone, MIN(minprice) as allMin, MAX(maxprice) as allMax
      FROM preference
      GROUP BY phone) p INNER JOIN customer c on p.phone = c.phone
WHERE allMin = allMax

答案 2 :(得分:0)

这将显示具有相同价格偏好的所有客户名称。

SELECT minprice, maxprice, GROUP_CONCAT(name) names
FROM preference
JOIN customer USING (phone)
GROUP BY minprice, maxprice
HAVING COUNT(*) > 1

HAVING子句阻止它显示没有重复项的首选项。如果您想查看这些单客户首选项,请删除该行。