在Oracle sql

时间:2018-10-10 11:10:18

标签: sql oracle

这可能是一个简单的查询,但是我是新手,无法弄清楚。 我有一个包含订单的表,另一个包含这些订单来自的位置的表。它们之间有一个公用密钥。 问题是一个订单可能来自多个位置,我需要查找仅来自一个位置的订单。

如何确保所有重复的订单号具有相同的位置,并且仅查询该订单号一次?

预先感谢您的帮助!

 t1                    t2
ordno | shortl62    shortl62 | loc
----------------     --------------
00567 | 128          128     | CA
00689 | 128          291     | LA
00567 | 291          321     | BI
00689 | 128          499     | GA
00567 | 321
00336 | 128
00189 | 499

2 个答案:

答案 0 :(得分:0)

您没有向我们显示任何DDL命令,因此让我根据您的问题创建一些示例。

我们有2个表,一个表有订单,第二个表有订单位置。

CREATE TABLE "ORDERS" ("ORDERID" NUMBER, "DATA" VARCHAR2(200), PRIMARY KEY("ORDERID"));
INSERT INTO "ORDERS" VALUES (1, 'test order 1');
INSERT INTO "ORDERS" VALUES (2, 'test order 2');
INSERT INTO "ORDERS" VALUES (3, 'test order 3');
INSERT INTO "ORDERS" VALUES (4, 'test order 4');

CREATE TABLE "LOCATIONS" ("LOCATIONID" NUMBER, "ORDERID" NUMBER, "CITY" VARCHAR2(200), PRIMARY KEY("LOCATIONID"));
INSERT INTO "LOCATIONS" VALUES (1,1, 'NEW YORK');
INSERT INTO "LOCATIONS" VALUES (2,1, 'CHICAGO');
INSERT INTO "LOCATIONS" VALUES (3,1, 'ATLANTA');
INSERT INTO "LOCATIONS" VALUES (4,2, 'SAN FRANCISCO');
INSERT INTO "LOCATIONS" VALUES (5,3, 'LOS ANGELES');
INSERT INTO "LOCATIONS" VALUES (6,3, 'LAS VEGAS');
INSERT INTO "LOCATIONS" VALUES (7,3, 'MOSCOW');
INSERT INTO "LOCATIONS" VALUES (8,4, 'PARIS');

有问题的查询是非常简单的带有子查询的选择。

SELECT "ORDERS"."ORDERID", "ORDERS"."DATA"
FROM "ORDERS"
WHERE (
  SELECT COUNT(*)
  FROM "LOCATIONS"
  WHERE "LOCATIONS"."ORDERID"="ORDERS"."ORDERID")=1 ;

子查询获取每个订单的计数,WHERE子句询问该计数是否等于1。

但是对于最佳数据模型,应该有3个表,一个用于订单,第二个用于可能的位置,然后第三个表用于订单和位置之间的M:N关系。这是为了防止数据重复,因为我假设许多位置会被重复使用多次。

答案 1 :(得分:0)

这将起作用:

create table t11(col1 varchar(20),col2 varchar(20));
create table t22(col3 varchar(20),col4 varchar(20));

insert into t11 values('00567','128');
insert into t11 values('00689','128');
insert into t11 values('00567','291');
insert into t11 values('00689','128');
insert into t11 values('00336','321');
insert into t11 values('00336','128');
insert into t11 values('00189','499');

insert into t22 values('128','CA');
insert into t22 values('291','LA');
insert into t22 values('321','BI');
insert into t22 values('499','GA');

select col1 from(SELECT  col1 FROM t11,t22 where 
t11.col2=t22.col3 
and t11.col1 in (SELECT col1 FROM t11 group by col1 having count(col1)>1)
and t22.col4='CA') group by col1 having count(col1)>1;

输出:

00689