Опитвам се да разбера пренаписването на заявки от EXISTS като JOIN и обратно.
Така че имам това:
Настройка на схема на Oracle 11g R2:
create table store
(
storeKey number,
storeName varchar2(500),
storeLocationKey number,
constraint StorePK primary key(storeKey)
);
create table storeLocation
(
storeLocationKey number,
storeLocationName varchar2(500),
storeCountry varchar2(500),
constraint StoreLocPK primary key(storeLocationKey)
);
insert into store values(1, 'Le Store', 1);
insert into store values(2, 'La tiendinha', 2);
insert into store values(3, 'The SuperHyperMegaStore', 3);
insert into store values(4, 'Le Other Store', 1);
insert into store values(5, 'La tienda', 4);
insert into store values(6, 'Chiquinha Tienda', 2);
insert into store values(7, 'Pecorela Tiendinha', 3);
insert into store values(8, 'Le Petit Store', 1);
insert into store values(9, 'Tienda Cipote', 4);
insert into store values(10, 'Tienda Desconocida', 0);
insert into storeLocation values(1, 'Camps Elisees', 'France');
insert into storeLocation values(2, 'Brasilia', 'Brasil');
insert into storeLocation values(3, 'Boston', 'USA');
insert into storeLocation values(4, 'San Salvador', 'El Salvador');
Заявка 1:
SELECT store.*
FROM store
LEFT OUTER JOIN storeLocation
ON store.storeLocationKey = storeLocation.storeLocationKey
WHERE storeLocation.storeCountry <> 'France'
ORDER BY store.storeKey ASC
| STOREKEY | STORENAME | STORELOCATIONKEY |
|----------|-------------------------|------------------|
| 2 | La tiendinha | 2 |
| 3 | The SuperHyperMegaStore | 3 |
| 5 | La tienda | 4 |
| 6 | Chiquinha Tienda | 2 |
| 7 | Pecorela Tiendinha | 3 |
| 9 | Tienda Cipote | 4 |
Заявка 2:
SELECT *
FROM store
WHERE EXISTS (
SELECT 1
FROM storeLocation
WHERE storeLocationKey = store.storeLocationKey
AND storeCountry <> 'France'
)
ORDER BY storeKey ASC
| STOREKEY | STORENAME | STORELOCATIONKEY |
|----------|-------------------------|------------------|
| 2 | La tiendinha | 2 |
| 3 | The SuperHyperMegaStore | 3 |
| 5 | La tienda | 4 |
| 6 | Chiquinha Tienda | 2 |
| 7 | Pecorela Tiendinha | 3 |
| 9 | Tienda Cipote | 4 |
Заявка 3:
-----------------------------
SELECT store.*
FROM store
LEFT OUTER JOIN storeLocation
ON store.storeLocationKey = storeLocation.storeLocationKey
where storeLocation.storeLocationName is null
ORDER BY store.storeKey ASC
| STOREKEY | STORENAME | STORELOCATIONKEY |
|----------|--------------------|------------------|
| 10 | Tienda Desconocida | 0 |
Заявка 4:
SELECT store.*
FROM store
WHERE NOT EXISTS (
SELECT NULL
FROM storeLocation
WHERE storeLocationKey = store.storeLocationKey
)
| STOREKEY | STORENAME | STORELOCATIONKEY |
|----------|--------------------|------------------|
| 10 | Tienda Desconocida | 0 |
от тук имам няколко (тъпи) въпроса:
Защо Заявки 2 и 4 трябва да бъдат свързани (когато не корелирах заявката, тя не върна нищо)? Съществува ли/не съществува ли трябва да бъде свързано, за да работи?
Какви са сценариите, при които е по-добре да работите с някой от тях?
Има ли разлика при работа с голям набор от данни (DW)?
Благодаря.