Sziasztok!
MSSQL alatt kellene megoldanom egy problémát, eddig ORACLE-t használtam, és nem
megy.
Adott egy A tábla egy index mezővel, adott egy B tábla szintén index mezővel,
A és B indexmezője kölcsönösen egyértelmű, ez alapján össze is kapcsolhatóak C-be.
Gyakorlatilag C-ben mindig kevesebb sor van, mint A-ban.
Ki kell választani A-ból azokat a sorokat, amelyek éppen nem szerepelnek C-ben.
-----------------------
Másképpen elmagyarázva adott a Valami tábla, és indexe, és adott a Foo tábla,
Ki kell választani a Foo táblából azokat a sorokat, amelyek _nem_ szerepelnek
a Valami táblában.
- 1408 megtekintés
Hozzászólások
Elvileg ennek mennie kene:
S ELECT * FROM A WHERE id NOT IN ( S ELECT id FROM B );
[a space-ek nelkul, csak ugy nem lehet postolni]
- A hozzászóláshoz be kell jelentkezni
Ezzel próbáltam, de nem ad helyes eredményt. Fogalmam sincs mi baja...
Másképpen hogy lehet?
- A hozzászóláshoz be kell jelentkezni
ugyanaz:
S ELECT * FROM a LEFT JOIN b ON (a.id=b.id) WHERE b.id IS NULL;
Hogyhogy nem ad jo eredmenyt? Az emlitett index mező az numerikus? Biztos hogy unique?
Az altalad leirt problema tenyleg a valos problema vagy csak egy leegyszerusitett kerdes volt?
- A hozzászóláshoz be kell jelentkezni
varchar[50]
- A hozzászóláshoz be kell jelentkezni
Nem engedi ide beszúrni, miféle portálmotor ez???????????????????,
- A hozzászóláshoz be kell jelentkezni
Töltsd fel valahova egy textfile-ban háborgás helyett.
--
Mortal Kombat's gimmikk was to replake all instankes of the letter 'C' with the letter 'K' (bekause of that feature, it was one of the first applikations to bekome part of KDE).
- A hozzászóláshoz be kell jelentkezni
Legyen egy mórocka, bonyolult megoldás:
Select *
from foo
where foo.id<>(select foo.id
from foo, Valami
where foo.id=valami.id)
- A hozzászóláshoz be kell jelentkezni
Nem tudom kiprobalni MSSQLben, de normal SQL alapokon ez szinte biztos hogy nem mukodik.
- A hozzászóláshoz be kell jelentkezni
Nem megy NOT IN-el...
Hülyeséget ad ki
- A hozzászóláshoz be kell jelentkezni
kiadja az egesz tablat.
- A hozzászóláshoz be kell jelentkezni
asdf
- A hozzászóláshoz be kell jelentkezni
Nem tudom beilleszteni a lekerdezest, mert tul hosszu, es nem engedi ide betenni.
- A hozzászóláshoz be kell jelentkezni
Nem engedi ide beszúrni, olyan, mintha SQL-re szűrne
- A hozzászóláshoz be kell jelentkezni
A "S ELECT" es hasonlo szavakat szuri sql injection miatt. Irj bele egy space-t.
- A hozzászóláshoz be kell jelentkezni
S ELECT *
F ROM autok
W HERE NOT E XISTS
(
S ELECT a.rendszam, a.tipus, a.alvazszam, a.gyartmany, a.evjarat, a.extrak, a.kategoria FROM autok a, dbo.kolcsonzott_autok k
W HERE (
(
(@kezdet<=k.indulas_idopontja AND @vege<=k.erkezes_idopontja AND
k.indulas_idopontja<=@vege AND k.indulas_idopontja<=k.erkezes_idopontja) OR
(k.indulas_idopontja<=@kezdet AND @vege<=k.erkezes_idopontja AND
@kezdet<=k.erkezes_idopontja
AND k.indulas_idopontja<=k.erkezes_idopontja) OR
(k.indulas_idopontja<=@kezdet AND @kezdet<=k.erkezes_idopontja AND
k.erkezes_idopontja<=@vege AND k.indulas_idopontja<=k.erkezes_idopontja) OR
(@kezdet<=k.indulas_idopontja AND k.erkezes_idopontja<=@vege
AND k.indulas_idopontja<=k.erkezes_idopontja)
) AND a.rendszam=k.jarmu_rendszam)
)
- A hozzászóláshoz be kell jelentkezni
Na itt van, a belso SE LECT jol mukodik, amikor gyakorlatilag kivonom a tablat, akkor az eredmeny rossz.
Ugyanilyen NOT IN-nel is. Nem tudom mi baja.
- A hozzászóláshoz be kell jelentkezni
Itt a rendszám az uniq id? (Szvsz nem szerencsés...)
A belső selectben a FROM előtt elég a rendszám is.
Sőt lehet, hogy ezért nem működik...
SELECT * FROM autok
WHERE autok.rendszam NOT IN (
SELECT a.rendszam FROM autok AS a
WHERE ((....)));
Most így hirtelen kipróbáltam sqlite alatt, ott működik, szerintem nálad is működnie kell...
"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o
- A hozzászóláshoz be kell jelentkezni
A fenti lekérdezés amit írtál szintén nem megy jól mssql alatt, most inkább másfelé keresem a hibát.
Lehet nagyon láma vagyok még ezen a téren, de ha a kulcs mezőt "uniqueindentifier" típusúra választom,
akkor mi fogja kitölteni a kulcsértékeket, ha nekem nem hagyja a VS vagy akár a mysql.
Hogy fogok ez alapján táblát összekapcsolni, ha nem tudom az értékeket kézzel írogatni.
Milyen típusúra állítsam a kulcs mezőt általában?
- A hozzászóláshoz be kell jelentkezni
"Lehet nagyon láma vagyok még ezen a téren, de ha a kulcs mezőt "uniqueindentifier" típusúra választom,
akkor mi fogja kitölteni a kulcsértékeket, ha nekem nem hagyja a VS vagy akár a mysql."
Ha nem hagyja, akkor nyilván automatikusan tölti ki. Egész egyszerűen megjegyzi mi volt a legnagyobb kulcs, és legközelebb eggyel nagyobbat ad.
Ez van ahol teljesen automatikus, van ahol kézzel is lehet állítani, meg automatikusan is, és van ahol mindenféle triggerekkel kell bohóckodni.
Ebből is látszik, hogy ez az id tényleg csak arra jó, hogy összekapcsolj táblákat, ill. egyértelműen meghatározz egy sort, de arra általában nem, hogy értelmes adatot is tárolj benne.
"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o
- A hozzászóláshoz be kell jelentkezni
Itt valami nem stimmel.
A fő szelect az "autokbol" szelektál NOT EXISTS-tel, de a belső szelektben nincs semmi kifejezés, ami ezzel a kulso táblával összekötné. Tehát minden sorra ugyanúgy fut le, tehat az egesz táblát adja mindig vissza. Nem jól látom?
- A hozzászóláshoz be kell jelentkezni
Azaz mit kellene tennem?
- A hozzászóláshoz be kell jelentkezni
Szerintem a külső "autonak" adj egy "aa" alias-t, aztan belülre valahova (végére):
W HERE .... AND a.rendszam = aa.rendszam
- A hozzászóláshoz be kell jelentkezni
Így már jó, de csak akkor, ha ToolStripről hívom. Ha a Fill-jét hívom a programból, akkor
ismét egész tábla....
Szóval most már ok a lekérdezés. Nem voltam tisztában a NOT EXIST-el.
- A hozzászóláshoz be kell jelentkezni
Tévedtem, egyszer működik, egyszer nem...........................................ááááááááááááááááá
Nagyon kész, nem tudom mi baja.
Ráadásul automatikusan kicserélte a <=-im egy részét <-re...
Meg átstrukturálja kérdezés nélkül.
- A hozzászóláshoz be kell jelentkezni
"Tévedtem, egyszer működik, egyszer nem"
MSSQL nem csinál ilyet, szerintem... máshol a bibi.
"Ráadásul automatikusan kicserélte a <=-im egy részét <-re..."
Valami normális fejlesztőeszközt kellene használnod ;)
- A hozzászóláshoz be kell jelentkezni
Akkor jó!
Amúgy az "erkezes_idopontja" es "indulas_idopontja" lehet NULL? Bekavarhat a feltételvizsgálatnál.
- A hozzászóláshoz be kell jelentkezni
Semmi nem lehet null
- A hozzászóláshoz be kell jelentkezni
Nemideszólt
- A hozzászóláshoz be kell jelentkezni
Sziasztok!
Amiket írtatok, szerintem mind helyesek, ami én írtam, az is helyes,
de mssql alatt nem jó eredményt ad.
Kicseréltem a kulcsmezőt bigint-re, és teljesen egyedi minden kulcs,
Ez alapján jól kapcsolja össze a táblát, de az eredmény továbbra is
az egész tábla.
Nem tudom mi lehet a baja.
Tamás
- A hozzászóláshoz be kell jelentkezni
S ELECT rendszam, tipus, alvazszam, gyartmany, evjarat, extrak, kategoria
F ROM autok
W HERE (rendszam NOT IN
(SE LECT jarmu_rendszam
F ROM kolcsonzott_autok
WH ERE (indulas_idopontja > @kezdet) AND (erkezes_idopontja > @vege) AND (indulas_idopontja <= @vege) AND
(indulas_idopontja <= erkezes_idopontja) OR
(indulas_idopontja <= @kezdet) AND (erkezes_idopontja > @vege) AND (indulas_idopontja <= erkezes_idopontja) AND
(erkezes_idopontja > @kezdet) OR
(indulas_idopontja <= @kezdet) AND (erkezes_idopontja > @kezdet) AND (indulas_idopontja <= erkezes_idopontja) AND
(erkezes_idopontja <= @vege) OR
(indulas_idopontja > @kezdet) AND (erkezes_idopontja <= @vege) AND (indulas_idopontja <= erkezes_idopontja)))
Akkor ebben is valami nem stimmel? Valaki azt irta, hogy jo.
- A hozzászóláshoz be kell jelentkezni
Ja és itt a kolcsonzott_autok egy nézettábla, amiben az autok és a kolcsonzes tabla van összekapcsolva
- A hozzászóláshoz be kell jelentkezni
Itt a "rendszam NOT IN" feltétel az "autok"-at szűri soronként, ez ilyen értelemben jó.
- A hozzászóláshoz be kell jelentkezni
ezt is kellene, hogy csinálja.
De én ebből valami nemdeterminisztikus viselkedést látok.
- A hozzászóláshoz be kell jelentkezni
S ELECT *
F ROM autok aa
W HERE NOT EXISTS
(
S ELECT a.rendszam, a.tipus, a.alvazszam, a.gyartmany, a.evjarat, a.extrak, a.kategoria FROM autok a, dbo.kolcsonzott_autok k
W HERE (
(
(@kezdet<=k.indulas_idopontja AND @vege<=k.erkezes_idopontja AND
k.indulas_idopontja<=@vege AND k.indulas_idopontja<=k.erkezes_idopontja) OR
(k.indulas_idopontja<=@kezdet AND @vege<=k.erkezes_idopontja AND
@kezdet<=k.erkezes_idopontja
AND k.indulas_idopontja<=k.erkezes_idopontja) OR
(k.indulas_idopontja<=@kezdet AND @kezdet<=k.erkezes_idopontja AND
k.erkezes_idopontja<=@vege AND k.indulas_idopontja<=k.erkezes_idopontja) OR
(@kezdet<=k.indulas_idopontja AND k.erkezes_idopontja<=@vege
AND k.indulas_idopontja<=k.erkezes_idopontja)
) AND aa.alvazszam=k.alvazszam)
)
- A hozzászóláshoz be kell jelentkezni
A kulcs mostantól nem a rendszam, hanem az alvazszam, ami bigint.
- A hozzászóláshoz be kell jelentkezni
A @kezdet es @vege biztos mindig jól kap értéket? Esetleg fixen be kellene valamit verni a helyükre, úgy kipróbálni.
- A hozzászóláshoz be kell jelentkezni
Mikor meg kell hívni a tábla frissítést, akkor kap értéket is.
Van két dátumdoboz, ha megváltoznak, akkor indul egy query is, amivel
Fill-eli a Datagrid-et. Szóval kap értéket. Legalábbis úgy tűnik.
- A hozzászóláshoz be kell jelentkezni
Ráadásul try, catch között van, ha hiba lenne, akkor tudnék róla.
- A hozzászóláshoz be kell jelentkezni
Hopp találtam valami hibát...fel lett cserélve véletlenül 2 dolog.
Automatikusan generálta a paraméteres query-t a VS és felcserélte a 2 paramétert...
- A hozzászóláshoz be kell jelentkezni
Én kipróbálnám. Fix szelekt, count(*)-ot neki, aztán osql-lel lefuttatni.
- A hozzászóláshoz be kell jelentkezni
Megoldva, thx mindenkinek, az automatikus query generálásnál hibádzott.
Paraméterek felcserélődtek nem az én hibámból.
- A hozzászóláshoz be kell jelentkezni
select-et csak kézzel, úgy érdemes
Koszorús költőnktől :D
- A hozzászóláshoz be kell jelentkezni