MSSQL probléma

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.

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]

Legyen egy mórocka, bonyolult megoldás:

Select *
from foo
where foo.id<>(select foo.id
from foo, Valami
where foo.id=valami.id)

Nem megy NOT IN-el...
Hülyeséget ad ki

Nem engedi ide beszúrni, olyan, mintha SQL-re szűrne

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)
)

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 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?

"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

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

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.

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)
)

Megoldva, thx mindenkinek, az automatikus query generálásnál hibádzott.
Paraméterek felcserélődtek nem az én hibámból.