Sziasztok!
Van egy ilyen leválogatás:
SELECT * FROM elso LEFT JOIN masodik valami ON (valami.masodik_id = elso.masodik_id) where valami.adat like 'x'
Hogy lehetne az "elso" táblában UPDATE-et végrehajtani a fenti szűrésnek megfelelő sorokon?
Nem vagyok járatos az SQL-ben, de most kellene néhány adatot módosítanom. Megköszönném, ha valaki segítene!
- 1860 megtekintés
Hozzászólások
Ha az "elso" táblán van elsődleges kulcs, akkor:
UPDATE elso
SET akarmi=ertek
WHERE id IN (SELECT id FROM elso LEFT JOIN masodik valami ON (valami.masodik_id = elso.masodik_id) where valami.adat like 'x')
- A hozzászóláshoz be kell jelentkezni
ez jo, lehet kombinalni temporary table-vel is (meltanytalanul hanyagolt)
- A hozzászóláshoz be kell jelentkezni
Kösz, kipróbálom!
- A hozzászóláshoz be kell jelentkezni
Kipróbáltam:
Bár a lekérdezés maga fél perc alatt lefut, az update gyakorlatilag lefagy. A DB szerver felnyomja a processzort 98 %-ra és egy idő után lelövöm, mert nem győzöm kivárni.
Szomorú vagyok!
- A hozzászóláshoz be kell jelentkezni
Nos, vagy megoldod vagy ez az az időpillanat, amikor a tábláid szerkezetét közzéteszed, hogy valaki tudjon segíteni.
- A hozzászóláshoz be kell jelentkezni
Hány rekordon kell végezni a műveletet?
- A hozzászóláshoz be kell jelentkezni
kb 4500 ill. 9000
- A hozzászóláshoz be kell jelentkezni
Én most érzem úgy hogy eljött a pillanat. Ekkora adathalmaznál nem szabadna hogy elhasaljon, ha optimálisan van indexelve. A példákban csak PK-ek voltak az indexek, nem tudom a valós probléma esetén mi a pontos lekérdezés :(
- A hozzászóláshoz be kell jelentkezni
kb ilyenek:
CREATE TABLE elso (
elso_id LINT NOT NULL,
akarmi AKARMI /*varchar(4)*/,
masodik_id LINT NOT NULL,
PRIMARY KEY (elso_id)
);
ALTER TABLE elso ADD FOREIGN KEY (masodik_id) REFERENCES masodik(masodik_id);
CREATE TABLE masodik (
masodik_id LINT NOT NULL,
adat ADAT /*varchar(10)*/,
PRIMARY KEY (elso_id)
);
- A hozzászóláshoz be kell jelentkezni
Az update-ben ez szerepel:
SET akarmi=ertek
Az akarmi típusa:
akarmi AKARMI /*varchar(4)*/
Figyelj arra, hogy az ertek idézőjelben legyen, hogy ne kelljen konvertálni:
SET akarmi="ertek"
Adok 60%-ot, hogy erről van szó.
- A hozzászóláshoz be kell jelentkezni
Persze, csak azt nem én írtam.
- A hozzászóláshoz be kell jelentkezni
Ezt most copy vagy begépelted?
Gondolom, begépelted mivel a második táblában nincs elso_id és mégis az van beállítva primary-nak
Nem tudnál inkább egy rendes dump-ot idetenni?
Egyébként milyen adatbázisszerver? (MySQL, MsSQL, Firebird, ...)
- A hozzászóláshoz be kell jelentkezni
A valódi - copy&paste - táblák ismeretében ez a probléma már megoldódott volna, de az nbh nem engedi a titkos struktúrákat kiadni. :)
- A hozzászóláshoz be kell jelentkezni
Íme a "paste":
CREATE TABLE KONYV
(
KONYV_ID LINT DEFAULT 0 NOT NULL,
CIMJEGYZ_ID LINT DEFAULT 0 NOT NULL,
KONYV_TIPUS_KOD PAR_KOD,
DATUM DATMA DEFAULT "today",
ELOZO_ID LINTN,
KOVETO_ID LINTN,
PRIMARY KEY (KONYV_ID)
);
ALTER TABLE KONYV ADD
FOREIGN KEY (CIMJEGYZ_ID) REFERENCES CIMJEGYZ (CIMJEGYZ_ID) ON UPDATE NO ACTION ON DELETE NO ACTION;
CREATE TABLE CIMJEGYZ
(
CIMJEGYZ_ID LINT DEFAULT 0 NOT NULL,
NYILV_DAT DATMA DEFAULT "today",
NEV NEV,
STATUSZ _KOD NOT NULL,
PRIMARY KEY (CIMJEGYZ_ID),
CONSTRAINT ALTER_KEY1 UNIQUE (NEV)
);
- A hozzászóláshoz be kell jelentkezni
?
update KONYV set KONYV_TIPUS = 'uj_konyv_tipus'
where CIMJEGYZ_ID in ( select CIMJEGYZ_ID from CIMJEGYZ where NEV like 'pistike%' );
- A hozzászóláshoz be kell jelentkezni
Ez az. Működik :)
Köszönöm!
- A hozzászóláshoz be kell jelentkezni
Talán nem kell az a join (egyébként én inkább inner join-t használnék)
UPDATE konyv SET 'ide jon valami'
WHERE cimjegyz_id IN (SELECT cimjegyz_id FROM cimjegyz where cimjegyz.nev like 'ide is jön valami')
Szerk: megelőztek :)
- A hozzászóláshoz be kell jelentkezni
Köszi! Tökéletes!
Valószínűleg tényleg a join fogta meg. Nagyon leragadtam a leválogatásnál, ugyanúgy akartam volna módosítani is.
A SELECT menne vajon join nélkül is?
- A hozzászóláshoz be kell jelentkezni
Ugye ?! Jó kérdésre jön a megoldás ! xD
- A hozzászóláshoz be kell jelentkezni
Igen, de a kérdés csupán az eredetileg feltett kérdés volt.
Nem kérdeztem semmi mást, később sem.
- A hozzászóláshoz be kell jelentkezni
általános kérdésre általános választ kapsz
konkrét kérdés -> na vajon mi?
További jó munkát!
- A hozzászóláshoz be kell jelentkezni
Ja, csak kibontottad az igazság minden részletét, miután baszbirgáltalak. Addig fals infókat adtál, mellé is ment pár válasz. Pusztán rávezettelek, hogy jól kell kérdezni és meg kell adni a kérdés mellé a pontos információkat, amelyek a rendelkezésedre állnak, akkor lesz jó válasz nagy valószínűséggel. Látom, még nem érted.
- A hozzászóláshoz be kell jelentkezni
Értem én. Igazad is van!
De a megoldásokból is jól látszik, hogy indifferens volt az adatszerkezet pontos ismerete. A fölösleges join miatt nem ment. Mivel kezdő vagyok, azt hittem, az a tuti, hogy a lekérdezésnél jó eredményt produkáló feltétel kell a módosításhoz is.
- A hozzászóláshoz be kell jelentkezni
Azért annak a LEFT JOIN-nak van jelentése is...
- A hozzászóláshoz be kell jelentkezni
Nem egészen volt indiferens...Az össze "hurrá működik" megoldás a valós struktúrák közlése után érkezett. Talán mégis volt jelentősége. :)
- A hozzászóláshoz be kell jelentkezni
"Talán mégis volt jelentősége."
Mégsem tudom, hogy mi.
Mivel nem értek az SQL-hez (konkrét feladat megoldásához kellett most használnom), el is magyarázhatnád.
- A hozzászóláshoz be kell jelentkezni
Például az, hogy az első, a kézzel fabrikált struktúrád hibás volt ha jól emlékszem, azaz félrevezető. De mindegy is. Ha segítséget kérsz, az a mínium, hogy minden rendelkezésreálló infót megadsz és nem találóskérdésként tálalod. Nincs jelentősége, én értem :)
- A hozzászóláshoz be kell jelentkezni
Nem állt szándékomban találóskérdést feladni. Egyszerűen csak bepötyögtem egy papírlapról (ami amúgy is előttem volt) azokat a részeket, amiket lényegesnek gondoltam (egyszerűsítve), és kihagytam azokat, amelyeket feleslegesnek ítéltem.
- A hozzászóláshoz be kell jelentkezni
Értem...de mivel kérdeztél, ítéljen más :)
- A hozzászóláshoz be kell jelentkezni
A gond azonban az, hogy egy olyan temakor szempontjai szerint probaltal lenyeges es nem lenyeges kozott kulonbseget tenni, amit nem ismersz. Ha valamit nem ismersz, akkor inkabb ne kiserletezgess ilyenekkel, mert rovid uton katasztrofa lesz a vege. Inkabb ird be a nem relevans reszeket is, minthogy kihagyj egy relevansat.
--
()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.
- A hozzászóláshoz be kell jelentkezni
Használsz indexelést? Foreign Key a második_id? A like elég lassú nem lehet kiváltani valamivel?
- A hozzászóláshoz be kell jelentkezni
>Használsz indexelést?
igen
>Foreign Key a második_id?
nem
>A like elég lassú nem lehet kiváltani valamivel?
lehet, de ugyanaz van
Csudába, összekevertem a FOREIGN-t a PRIMARY-val!
- A hozzászóláshoz be kell jelentkezni
"ALTER TABLE elso ADD FOREIGN KEY (masodik_id) REFERENCES masodik(masodik_id);"
">Foreign Key a második_id?
nem"
most akkor melyik állítás az igaz?
- A hozzászóláshoz be kell jelentkezni
Itt az első.
A "nem" volt az elírás. (valójában nem elírás volt, hanem tévedés)
- A hozzászóláshoz be kell jelentkezni
SELECT * FROM elso LEFT JOIN masodik valami ON (valami.masodik_id = elso.masodik_id) where valami.adat like 'x'
1. like 'x' nem túl jó. Vagy like 'x%', vagy = 'x'
2. a megoldás (szerintem)
UPDATE elso, masodik
SET elso.mezonev=ertek
WHERE valami.masodik_id = elso.masodik_id and valami.adat like 'x'
legalábbis http://dev.mysql.com/doc/refman/5.0/en/update.html tartalmaz ilyet:
UPDATE items,month SET items.price=month.price
WHERE items.id=month.id;
szóval szerintem mennie kéne.
- A hozzászóláshoz be kell jelentkezni
Az "elso" utáni vesszőre ismeretlen token hibaüzenetet ad (firebird).
Köszönöm egyébként. Fentebb már kaptam megoldást 2x is.
- A hozzászóláshoz be kell jelentkezni
ja, hogy firebird. At hittem, hogy mysql.
- A hozzászóláshoz be kell jelentkezni