» »

[SQL] Razlika 2 množic

[SQL] Razlika 2 množic

c00L3r ::

Imam torej tabelo A in tabelo B. V vsaki od teh tabel je samo 1 stolpec. Velja pa da je tabela B podmnožica tabele A. Kako dobit tiste vrednosti, ki so v tabeli A, ni pa jih v tabeli B?

primer:
Tabela A
Marko
Rok
Peter
Matjaž

Tabela B
Rok
Peter


V tem primeru bi se morali vrniti samo vrednosti "Marko" in "Matjaž".
Seveda sem dal poenostavljen primer :) Mislim da je neka preprosta rešitev, pa vendar ne vem kako naredit operacijo razlike z SQL-om. Uporabljam pa mysql.

moowy123 ::

A - ( A presek B )

joze67 ::

select A.* from A left join B on A.ime = B.ime where B.ime is null

Nisem pa prepričan, ali gre tu za ANSI sintakso; delalo bi na MS SQL

c00L3r ::

moowy123 ne vem kaj si hotel s tem povedat?
Hvala joze67! Rezultat ki ga dobim zgleda pravilen, moram še samo preverit.

AndyS ::

Razlika:
SELECT ime FROM a WHERE ime NOT IN (SELECT ime FROM b)

preem ::

oo ta že subselecte dela, boljš joinat. manj zahtevno, pri 10 miljonov vnosov bi se poznalo :p

krneki0001 ::

oo ta že subselecte dela, boljš joinat. manj zahtevno, pri 10 miljonov vnosov bi se poznalo :p


Pri 10 miljonih sta tako subselect kot join zelo požrešna in počasna.

"Trenutno" je najhitrejša zadeva za ogromno podatkov, če delaš program in boš to velikokrat uporabljal, da narediš fetch prve tabele in jo potem v programu primerjaš z drugo, pa tiste, ki jih v prvi nisi našel, zapišeš nekam.

"Trenutno" v narekovajih, pa zato, ker se recimo v DB2 zadeve zelo spreminjajo in v verziji 6 je bila kaka stvar tako počasna, da so jo odsvetovali, v 7 je delala perfektno, v 8 so jo spet odsvetovali zaradi požrešnosti CPU-ja in v 9 že spet deluje odlično in uporablja pol manj CPU-ja.

frudi ::

"Trenutno" je najhitrejša zadeva za ogromno podatkov, če delaš program in boš to velikokrat uporabljal, da narediš fetch prve tabele in jo potem v programu primerjaš z drugo, pa tiste, ki jih v prvi nisi našel, zapišeš nekam.

V splošnem ne vidim smisla v takšnem početju. SQL engine (pa katerikoli to že je) bo skoraj zagotovo bolj učinkovito poiskal razliko dveh tabel, kot kakršenkoli algoritem, ki ga implementiraš v programu. Že zato, ker ima že pripravljene indekse in statistike, s katerimi si pomaga. Končni rezultat pa lahko v vsakem primeru shraniš v programu, ne glede na to, ali si ga sfiltriral sam ali pa si ga dobil sfiltriranega iz SQL serverja.
Eventualno je takšno početje smiselno, če želiš razbremeniti SQL server na račun aplikacijskega serverja oz. klientov. Če se pa že lotevaš delitve bremena, boš moral upoštevati še druge faktorje (obremenitev omrežja, zmogljivost klientov, tipični vzorci uporabe... itd).

oo ta že subselecte dela, boljš joinat. manj zahtevno, pri 10 miljonov vnosov bi se poznalo :p

Ni nujno res, je pa verjetno zelo odvisno od posameznega SQL serverja. Microsoftov query optimizer recimo za oba primera (pri tako enostavni tabeli) pripravi enak execution plan. Tudi za tretjo 'popularno' metodo - uporabo NOT EXISTS - je execution plan enak, tako da se vsi načini izvajajo enako dolgo.
1ACDoHVj3wn7N4EMpGVU4YGLR9HTfkNhTd... in case I've written something useful :)

destiny ::

Še ena možnost je ta:
select ime from A minus select ime from B;

...nisem pa preverjal in primerjal execution plana

c00L3r ::

Razlika:
SELECT ime FROM a WHERE ime NOT IN (SELECT ime FROM b)

Hvala AndyS. Bom kar tvoj stavek uporabil, ker mi je bolj logičen. Je pa rezultat pravilen tako pri tvojem, kot pri joze67-evem.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Načrtovanje in omplementacija podatkovnih baz(pomoč)

Oddelek: Programiranje
6809 (589) mihies
»

SQL stavek?

Oddelek: Programiranje
7933 (838) milc
»

[MySql] obratno od DISTINCT

Oddelek: Programiranje
101385 (1203) frudi
»

SQL vprašanje

Oddelek: Izdelava spletišč
302550 (2113) jerneju
»

Visual Studio Net

Oddelek: Izdelava spletišč
181404 (1059) smash

Več podobnih tem