这可能是一个简单的查询,但是我是新手,无法弄清楚。 我有一个包含订单的表,另一个包含这些订单来自的位置的表。它们之间有一个公用密钥。 问题是一个订单可能来自多个位置,我需要查找仅来自一个位置的订单。
如何确保所有重复的订单号具有相同的位置,并且仅查询该订单号一次?
预先感谢您的帮助!
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
答案 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