Sql 获取表中数据相同的结果
我需要得到所有客户的名字,他们的偏好MINPRICE和MAXPRICE是相同的 以下是我的模式: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
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
;)