1

Temat: [SQL] Zapytanie z dwoma tabelami

Witam wszytkich,
Mam taki problem:
Mam dwie tabele:
Points:
-----------------------------
id serial NOT NULL,
  osmid bigint,
  latitude double precision,
  longitude double precision,
------------------------------------
Segment
ids bigint,
  way_id bigint,
  start_node_id bigint,
  end_node_id bigint,
  length_km double precision,
  max_speed_km_h integer,

Przyklad:
Points: id = 1, osmid = 223,....,....
// i jet takich punktow np. 20,
Za to tabela Segment reprezetnuje tabele points z rozszerzeniem o kilka innych wlasnosci:
ids: 1, way_id=223,...,...,... i jest tych reprezentacji dla np. 100 punktow

Moje pytanie jak napisac zapytanie, by usuwalo rekordy z tabeli Segment takie, ktorych nie ma w tabeli Points - rozpoznajac po way_id (Segment) i osmid(Point).
tzn jesli w Point sa np. takie osmid : 1, 2, 3, 4, 5, to jesli w Segment w way_id sa 1,2,3,4,5,6,7,8 to zeby 6, 7 i 8 usuwalo

2

Odp: [SQL] Zapytanie z dwoma tabelami

może tak jeśli wynikiem mają być pola z tabeli segment
select s.*
from segment s
where exists (select 1 from points p where p.osmid=s.way_id);

lub tak jeśli wynikiem mają być pola z tabeli points

select p.*
from points p
where exists (select 1 from segment s where p.osmid=s.way_id);

lub tak jeśli  chcesz mieć dostęp do pól obu tabel
select *
from segment s
join points p on p.osmid=s.way_id

Ostatnio edytowany przez c_michal (2013-08-20 23:30:32)

3

Odp: [SQL] Zapytanie z dwoma tabelami

4

Odp: [SQL] Zapytanie z dwoma tabelami

No tak źle przeczytałem posta, chodzi Ci o coś takiego
DELETE FROM segment WHERE NOT EXISTS (SELECT 1 FROM points p where p.osmid = segment.way_id);

5

Odp: [SQL] Zapytanie z dwoma tabelami

Wielkie dzieki c_Michal i adamleon smile interesuje mnie co oznacza ten kawalek:
DELETE FROM segment WHERE NOT EXISTS (SELECT <b>1 </b>FROM points p where p.osmid = segment.way_id);
// ta jedynka, bo w niektorych przykladach jest NULL
I taka doszlo mi jezcze jedno wymaganie zeby sprawdzal po dwoch kolumnach - juz nie po way_id tylko po:
- osm_start_node_id
- osm_end_node_id

Wymyslilem zeby polaczyc to OR'em i takie cos mi wyszlo:

DELETE FROM segments
WHERE NOT EXISTS(SELECT 1
                    FROM points f
                   WHERE f.osmid = osm_start_node_id
                   OR f.osmid = osm_end_node_id);
Rollback;
Jednak teraz zapytanie wykonuje sie bardzo dlugo, doszlo gdzies do 15 minut i dalej idzie.... (zapytanie wykonuje sie dla 817 000 rekordow wiec chyba nie ma prawa az tak dlugo ?? Wydaje mi sie ze moze jakas petla nieskonczona.... nieiwem - moze znajdziecie mi blad jaki tutaj zrobilem... Dzieki z gory i pozdrawiam
Michal

6

Odp: [SQL] Zapytanie z dwoma tabelami

7

Odp: [SQL] Zapytanie z dwoma tabelami

8

Odp: [SQL] Zapytanie z dwoma tabelami

Dzięki C_Michal :-) wszystko idealnie sie wyselekcjonowalo i usunelo- sprawdzilem jeszcze w programach graficznych czy punkty to te ktore chcialem usunac i wszystko gra smile
Dzieki wszytkim uzytkownikom za wlozony trud w napisanie odpowiedzi na moje pytania- Pozdrawiam Michał :-)

9

Odp: [SQL] Zapytanie z dwoma tabelami

Moje dodatkowe pytanie- jesli w tabeli mam koumny :
tabela segmetns:
- idGlowne
- id_punktu_Startu
- id_punktu_Mety
tzn cos takiego: 12 | 12121121 | 133131313

i mam tabele points - gdzie te numery id to dany punkt z koordynatami X i Y
czyli: 12121121 | 20.2323 | 50.09099
133131313 | 89.09090 | 23.23232

Podsumowujac segments to poprostu droga miedzy dwoma punktami prezetnowana jako id tych punktow
i teraz przechodzac do pytania: jak zrobic zapytanie do tabeli segments zeby zamiast podawac mi id punktow X i Y to zeby mi podalo jego koordynaty (te liczby zmiennoprzecinkowe)
Pozdrawiam Michał

10

Odp: [SQL] Zapytanie z dwoma tabelami

Ostatnio edytowany przez c_michal (2013-10-20 21:04:53)