Jeg har bygget en shop på MySQL og skal have den konverteret til MS SQL. Følgende SQL virker i MySQL men ikke i MSSQL..
SELECT COUNT(I.ID) AS Number,B.ID As BasketID, I.ID As ItemID, I.Name, B.Price, I.Weight, S.Rank As ShippingRank, S.ID As ShippingID FROM Baskets B INNER JOIN ItemStock ISt ON ISt.ID=B.ItemStockID INNER JOIN Items I ON I.ID=ISt.ItemID LEFT JOIN ShippingMethods S ON S.ID=I.ShippingMethodID WHERE B.StatusID=0 AND B.SessionID=1043053607 GROUP BY I.ID, B.Price
Der kommer følgende fejl: Msg 8120, Level 16, State 1, Line 1 Column 'Baskets.ID' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
SELECT COUNT(I.ID) AS Number,B.ID As BasketID, I.ID As ItemID, I.Name, B.Price, I.Weight, S.Rank As ShippingRank, S.ID As ShippingID FROM Baskets B INNER JOIN ItemStock ISt ON ISt.ID=B.ItemStockID INNER JOIN Items I ON I.ID=ISt.ItemID LEFT JOIN ShippingMethods S ON S.ID=I.ShippingMethodID WHERE B.StatusID=0 AND B.SessionID=1043053607 GROUP BY I.ID, B.Price, BasketID eller evt. SELECT COUNT(I.ID) AS Number,B.ID As BasketID, I.ID As ItemID, I.Name, B.Price, I.Weight, S.Rank As ShippingRank, S.ID As ShippingID FROM Baskets B INNER JOIN ItemStock ISt ON ISt.ID=B.ItemStockID INNER JOIN Items I ON I.ID=ISt.ItemID LEFT JOIN ShippingMethods S ON S.ID=I.ShippingMethodID WHERE B.StatusID=0 AND B.SessionID=1043053607 GROUP BY I.ID, B.Price, b.ID
Ved den sidste, kommer følgende fejl: Msg 8120, Level 16, State 1, Line 1 Column 'Items.Name' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
MS-SQL kræver at alle de felter der vælges/vises i SELECT skal medtages i GROUP BY. Og ja, det er lidt irriterende når man konverterer systemer fra MySQL.
Men så når jeg tager alle felter med, så gør den ikke som jeg gerne vil have.. den skal jo gruppere resultaterne sammen hvor I.ID og B.Price er ens, og tælle antal grupperede..
Men så når jeg tager alle felter med, så gør den ikke som jeg gerne vil have.. den skal jo gruppere resultaterne sammen hvor I.ID og B.Price er ens, og tælle antal grupperede..
SELECT COUNT(I.ID) AS Number,B.ID As BasketID, I.ID As ItemID, I.Name, B.Price, I.Weight, S.Rank As ShippingRank, S.ID As ShippingID FROM Baskets B INNER JOIN ItemStock ISt ON ISt.ID=B.ItemStockID INNER JOIN Items I ON I.ID=ISt.ItemID LEFT JOIN ShippingMethods S ON S.ID=I.ShippingMethodID WHERE B.StatusID=0 AND B.SessionID=1043053607 GROUP BY I.ID, B.Price, BasketID, I.ID As ItemID, I.Name, B.Price, I.Weight, S.Rank må det vel så være ;o)
Altså.. den her virker.. (ikke helt efter hensigten)
SELECT COUNT(I.ID) AS Number,B.ID As BasketID, I.ID As ItemID, I.Name, B.Price, I.Weight, S.Rank As ShippingRank, S.ID As ShippingID FROM Baskets B INNER JOIN ItemStock ISt ON ISt.ID=B.ItemStockID INNER JOIN Items I ON I.ID=ISt.ItemID LEFT JOIN ShippingMethods S ON S.ID=I.ShippingMethodID WHERE B.StatusID=0 AND B.SessionID=1043053607 GROUP BY I.ID, B.Price, B.ID, I.ID, I.Name, I.Weight, S.Rank, S.ID
Altså den skal returnere det mindste B.ID, hvis ellers prisen er ens?
Så kan du bare sætte MIN på B.ID feltet og fjerne det fra GROUP BY.
SELECT COUNT(I.ID) AS Number, MIN(B.ID) As BasketID, I.ID As ItemID, I.Name, B.Price, I.Weight, S.Rank As ShippingRank, S.ID As ShippingID FROM Baskets B INNER JOIN ItemStock ISt ON ISt.ID=B.ItemStockID INNER JOIN Items I ON I.ID=ISt.ItemID LEFT JOIN ShippingMethods S ON S.ID=I.ShippingMethodID WHERE B.StatusID=0 AND B.SessionID=1043053607 GROUP BY I.ID, B.Price, I.ID, I.Name, I.Weight, S.Rank, S.ID
Problemet opstår fordi, ikke fordi MS SQL gør noget forkert, men fordi MySQL er en snyder. Den tillader, at man "glemmer" at opføre alle medtagne ikke-sum felter i sin GROUP BY og returnerer bare en værdi fra en tilfældig række inden for den gruppe man arbejder med. Det gør i mange tilfælde tingene lidt lettere for programmøren, men lader på den anden side døren stå pivåben for uventede resultater, som ikke kan bruges. Så vær glad for, at SQL server gør det rigtige.
Lukker spørgsmålet.. bare lige giv et svar så får i point :)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.