Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 获取表中数据相同的结果_Sql_Oracle - Fatal编程技术网

Sql 获取表中数据相同的结果

Sql 获取表中数据相同的结果,sql,oracle,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 VA

我需要得到所有客户的名字,他们的偏好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

首选项上的自连接将发现具有相同首选项但电话号码不同的行:

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
选择不同的c1.name
,p1.minprice
,p1.maxprice
来自首选项p1
连接首选项p2
在p1.phone上p2.phone
p1.minprice=p2.minprice
p1.maxprice=p2.maxprice
加入客户c1
在c1.phone=p1.phone上
加入客户c2
在c2.phone=p2.phone上
订购人
p1.2价格
,p1.maxprice
,c1.name

您的首选项表中有minprice和maxprice,这似乎很奇怪。这是一个在每次交易后更新的表,这样每个客户只有一个活动的首选项记录吗?我的意思是,这看起来像是一个顾客可以为同一件商品支付两种不同的价格,这似乎很奇怪

假设客户和偏好为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

这将显示具有相同价格首选项的所有客户名称

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

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

(电话号码不是主键/客户标识符的好主意。人们会更改电话号码。)有更好的动态方法吗?如果我有3个名字有相同的值,10个名字有相同的值,我不希望他们在3个名字之间配对两次。我需要一个具有相同值的不同名称的列表修改了查询,以便获得具有相同价位的名称列表。如果您想要一个格式化的列表,请查看。客户端可能做得更好。您应该使用
@Barmar:注意,它每行列出一个客户。现在编写的查询实际上需要两对。因此,您告诉所有拥有另一个具有相同偏好的客户的客户,但没有显示他们与谁配对?抱歉,这是一对多。一个客户可以有多个首选项,因此我需要查询具有相同minprice和maxprice的客户列表。比较行minprice=minprice和行maxprice=maxprice如果Oracle支持
group_concat
,这将是最好的解决方案:)@Andomar Oops,忘了他使用的是Oracle,而不是MySQL。@Andomar Oracle支持
listag
;)