INVOEGEN ... SELECT syntax error in join operator

Ik probeer een winkelmandje in een order + orderregel te schrijven in een sql-database van C# asp.net. de orderregel zal een bestelnummer, totale prijs, productid, hoeveelheid etc. bevatten voor elk item in het winkelmandje. De bestelling zelf zal het bestelnummer als primaire sleutel bevatten en hierdoor worden gekoppeld aan de verschillende regels. Alles werkte prima gisteren, maar nu ik probeerde een SELECT-opdracht te gebruiken in de insert-in-instructie om dingen dynamischer te maken, krijg ik de hierboven beschreven syntaxisfout.

Weet iemand wat er mis is met deze verklaring:

INSERT INTO [order] 
        (klant_id,totaalprijs,btw,subtotaal,verzendkosten)
SELECT  klant.id
,       SUM(orderregel.totaalprijs)
,       SUM(orderregel.btw)
,       SUM(orderregel.totaalprijs) - SUM(orderregel.btw)
,       7.50 
FROM    orderregel
INNER JOIN  
        klant 
ON      [order].klant_id = klant.id  
WHERE   klant.username = 'jerry' 
GROUP BY 
        id;

het ordernummer in de tabel "order" staat op autonumber, in de asp-codebehandeling is er een voor elk die de regels behandelt die voor elk product worden geschreven, er is een index ingesteld op 0 buiten deze lus en is verhoogd met 1 aan elk uiteinde ervan . De uitvoering van de bestelling wordt slechts één keer uitgevoerd aan het begin van de eerste lus en de regels worden achteraan toegevoegd met MAX (ordernummer) als ordernummer.

Ik hoop dat ik voldoende informatie heb verstrekt en dat iemand in staat is om mij te helpen. Bij voorbaat dank!

BEWERK: bedankt iedereen, met behulp van deze vraag deed het!

VOEG IN [bestelling]           (klant_id, totaalprijs, btw, subtotaal, verzendkosten) SELECT (SELECT klant.id FROM klant WHERE klant.username = 'jerry'),
  SUM (orderregel.totaalprijs), SUM (orderregel.btw),
  SUM (orderregel.totaalprijs) - SUM (orderregel.btw), 7.50 FROM
  orderregel;

0
Je zou moeten uitvinden hoe je de relatie tussen order en orderregel invoegt. Er is een mogelijke oplossing in mijn antwoord. Ik zou er een nacht op slapen :)
toegevoegd de auteur Andomar, de bron
Uw EDIT-query zal niet werken. Probeer twee bestellingen in te voegen. Controleer vervolgens of de totaalprijs voor uw tweede bestelling correct is.
toegevoegd de auteur Andomar, de bron
Oké, bedankt man, misschien is dat toch het beste. Ik programmeer al lang niet meer, maar het duurde niet lang voor ik erachter kwam dat pauzes zo nu en dan echt nieuwe ideeën en ideeën over dingen geven!
toegevoegd de auteur user1477356, de bron
Hmmm ja ik heb het gemerkt, zie je hier een oplossing? Ik heb het nu alleen geprobeerd, maar de hele dag druk op het werk en programmeren nadat ik thuis ben gekomen, is niet zo goed voor mijn manier van werken;)
toegevoegd de auteur user1477356, de bron

3 antwoord

U hebt [order] in een JOIN gebruikt, als dit orderregel zou moeten zijn.

FROM    orderregel
    INNER JOIN klant ON [order].klant_id = klant.id 

zou moeten zijn:

FROM    orderregel
    INNER JOIN klant ON orderregel.klant_id = klant.id 

Bewerken

Waarom niet gewoon gebruiken:

INSERT INTO [order] 
        (klant_id,totaalprijs,btw,subtotaal,verzendkosten)
SELECT  (SELECT klant.id FROM klant WHERE klant.username = 'jerry')
,       SUM(orderregel.totaalprijs)
,...

... en vermijd JOIN with klant table?

3
toegevoegd
"klant" betekent klant in het Nederlands; het is onwaarschijnlijk dat een orderregel een relatie heeft met een klant.
toegevoegd de auteur Andomar, de bron
Na uw bewerking voert u een som uit op elke orderregel in het systeem;)
toegevoegd de auteur Andomar, de bron
Ook is er GROUP BY id , zonder de tabel te vermelden, dit kan ook tot een fout leiden (als er meerdere tabellen met kolom "id" in gebruik zijn)
toegevoegd de auteur poncha, de bron
Daarom begon ik de opmerking met "ook", want (a) misschien ziet hij dit na het verhelpen van de eerste fout en (b) omdat het de moeite van het vermelden waard is wanneer het gaat om samenvoegingen van joins;)
toegevoegd de auteur poncha, de bron
@poncha Je hebt gelijk.
toegevoegd de auteur Miroslav Popovic, de bron
Hehe, ja ... zag niet dat er geen andere WHERE in de query is :) Dit ziet er echt moeilijker uit dan het zou moeten zijn :) Ik denk dat de vraag moet worden aangepast om op zijn minst het schema voor alle betrokken tafels te hebben.
toegevoegd de auteur Miroslav Popovic, de bron
@ user1477356 Zie mijn bewerking
toegevoegd de auteur Miroslav Popovic, de bron
user1477356 - Helaas, zoals @Andomar al zei, is er weinig zin in uw zoekopdracht. U kunt niet gewoon een invoeging in de tabel doen en verwachten dat u de waarde van die tabel in JOIN kunt lezen. Misschien kunt u uw vraag bewerken en een beetje meer uitleggen over de relatie tussen de klassen Order en Klant.
toegevoegd de auteur Miroslav Popovic, de bron
@Andomar - is logisch, maar het was niet duidelijk uit de vraag - voor niet-nederlandse sprekers :)
toegevoegd de auteur Miroslav Popovic, de bron
@poncha - ja maar de fout zat deze keer in JOIN-gedeelte
toegevoegd de auteur Miroslav Popovic, de bron
Bedankt voor de reactie, het ding is dat orderregel geen klant.id heeft, het is de klant-ID die wordt gelezen bij het schrijven van de bestelling om te beslissen aan welke klant de bestelling moet worden geschreven. Ik heb geprobeerd een tweede binnenvoegsel te gebruiken in de opdracht tot samenvoeging binnen de selectie, maar daarvoor moest ik het doen op order.ordernummer = orderregel.ordernummer dat nog niet is aangemaakt op dit punt in de code erachter.
toegevoegd de auteur user1477356, de bron
Bedankt, dat heeft de truc gedaan, de select in de select :)
toegevoegd de auteur user1477356, de bron

U kunt niet verwijzen naar de tabel waarin wordt ingevoegd. Immers, die rijen zijn er nog niet voordat de insert compleet is!

Als u uw vraag leest, is het duidelijk dat u probeert de klant genaamd Jerry in te voeren. Maar hoe geeft u aan welke orderregels voor de insert worden gebruikt?

Een mogelijke oplossing:

  1. Write the order first, with the klant id
  2. Create the order lines. You know the orderid from the first query (f.e. using select SCOPE_IDENTITY()
  3. Update the order with totals
1
toegevoegd
+1 voor het opsporen van alle problemen met de query
toegevoegd de auteur Miroslav Popovic, de bron
Bedankt voor de reactie, je hebt helemaal gelijk hier. Ik lees de gebruikersnaam van de klant uit de ingebouwde functie C# codachterind.authenticatie. is er een manier om INNER JOIN klant op klant.username = 'jerry' Ik verplaats de parameter gewoon in de codebehandeling dan ...
toegevoegd de auteur user1477356, de bron

Probeer dit: INVOEGEN [bestellen]         (Klant_id, totaalprijs, tussen haakjes, subtotaal, verzendkosten) SELECT klant.id , SUM (orderregel.totaalprijs) , SUM (orderregel.btw) , SUM (orderregel.totaalprijs) - SUM (orderregel.btw) , 7,50 VAN orderregel INNER JOIN klant op orderregel.id = klant.id
INNER JOIN [bestelling] AAN [bestellen] .klant_id = klant.id
WHERE klant.username = 'jerry' GROUP BY id;

0
toegevoegd