Найти дубликаты, которые равны одному значению в другой таблице в Oracle Ocl - PullRequest
0 голосов
/ 10 октября 2018

это может быть простой запрос, но я новичок и не могу понять.У меня есть таблица с заказами и еще одна таблица с указанием мест, откуда поступили эти заказы.Между ними есть общий ключ.Проблема в том, что один заказ может поступить из нескольких мест, и мне нужно найти заказы, которые пришли только из одного места.

Как мне убедиться, что все повторяющиеся номера заказов имеют одинаковое местоположение, и один раз запросить только этот номер заказа?

Заранее спасибо за помощь!

 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 голосов
/ 10 октября 2018

это будет работать:

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
0 голосов
/ 10 октября 2018

Вы не показывали нам никаких команд 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 между заказами и местоположениями.Это сделано для предотвращения дублирования данных, так как я предполагаю, что многие местоположения будут использоваться много раз снова и снова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...