Går de att köra nån slags (LEFT) JOIN mot en Access databas? Och hur ser syntaxen ut för de isånnafall? <code> Ser ut att fungera. <code> Om du letar efter en fråga som ser ut så här: Tackar.... ser ut som att jag är en bit på vägen nu. Men ett problem har uppstått: Andreas, JAg vet inte hur du använder/anropar din SQL-satsen. Men du bör testa med att skriva något sådant här: Det har jag inte tänkt på. Men har råkat ut för att konstanter inte är tillåtna i ON vilkoret. Helt rätt Andreas att det är bättre att filtrera innan (det är ju faktiskt inte ens samma fråga, även om resultatet blir det samma). Jag förstår dock inte varför Access inte klarar av den sql-sats jag skrev, men så är väl läget helt enkelt. Testad för säkerhets skull mot Northwind: Ok, med lite eftertanke så håller jag med dig ang prestanda resonemanget.LEFT JOIN mot Access?
Sv: LEFT JOIN mot Access?
SELECT c.customerid, COUNT(o.orderid)
FROM CUSTOMERS c
LEFT OUTER JOIN ORDERS o
ON c.customerid = o.customerid
</code>
Listar alla kunder, samt hur många order varje kund har. Om en kund inte har några order blir värdet i den andra kolumnen 0. Skulle man däremot skrivit som nedan skulle inte kunden kommit med i resultatet alls om den inte hade några order:
<code>
SELECT c.customerid, COUNT(o.orderid)
FROM CUSTOMERS c
INNER JOIN ORDERS o
ON c.customerid = o.customerid
</code>Sv: LEFT JOIN mot Access?
Fast jag skulle vilja ha ett till kriterie mot den högra tabellen. Att ett fält ska vara siffran 2. Hur gör jag då?Sv: LEFT JOIN mot Access?
SELECT c.customerid, COUNT(o.orderid)
FROM CUSTOMERS c
LEFT OUTER JOIN ORDERS o
ON c.customerid = o.customerid
AND o.whatever = 2
</code>Sv: LEFT JOIN mot Access?
SELECT Customers.*, Orders.*
FROM Customers LEFT JOIN
Orders ON Customers.customerid = Orders.customerid AND Orders.Status = 2
Så går det tyvär inte att skriva i Access. Men du kan lösa det på så sätt att du skriver och sparar en fråga i Access:
Namn: qryOrdersStatus2
SELECT Orders.*
FROM Orders
WHERE Orders.Status = 2
Sedan göra en join mot frågan:
SELECT Customers.*, qryOrdersStatus2.*
FROM Customers LEFT JOIN
qryOrdersStatus2 ON Customers.customerid = Orders.customerid
Du kan även använda parametrar. På så sätt dynamiskt välja värde i den sparade frågan. Se uppskick: Avancerad summering i flera fråger i ASP
Programarkivet:Avancerad summering i flera fråger i ASPSv: LEFT JOIN mot Access?
En fråga som heter Query1 och ser ut som så här:
PARAMETERS [MinDate] DateTime;
SELECT BB.*
FROM BB
WHERE BB.BDate=[MinDate];
Sen min selectsats plus mer:
Const adDate = 7
Const adCmdTable = 2
Const adParamInput = 1
Set cmd = Server.CreateObject("ADODB.Command")
Set cmd.ActiveConnection= conn
cmd.CommandType = adCmdTable
cmd.CommandText = "Query1"
cmd.Parameters.Append cmd.CreateParameter("MinDate", adDate, adParamInput,,CDate("2003-03-03"))
SELECT * FROM DateNTime_LU LEFT JOIN Query1 ON DateNTime_LU.DID = Query1.BTime
Och får då felmeddelandet: "För få parametrar angavs. 1 förväntades."
Skriver jag istället:
SELECT * FROM DateNTime_LU LEFT JOIN Query1 ON DateNTime_LU.DID = BB.BTime
Då får jag meddelandet: "Syntaxfel i JOIN-operation."
Vart är felet?Sv: LEFT JOIN mot Access?
Jag tror det ska funka att skriva det med en fråga om man gör så här,
SELECT Customers.*, Orders.*
FROM Customers LEFT JOIN Orders ON Customers.CustomerId = Orders.CustomerId
WHERE Orders.Status=2 OR Orders.CustomerId Is Null;
Orders.CustomerId Is Null är sant om det inte finns någon post i Orders som matchar Customers.
Jag gjorde en snabbtest i Access och det verkar fungera.
//
JanneSv: LEFT JOIN mot Access?
<code>
Const adDate = 7
Const adCmdText = 1
Const adParamInput = 1
Set cmd = Server.CreateObject("ADODB.Command")
Set cmd.ActiveConnection = conn
cmd.CommandType = adCmdText
cmd.CommandText = "SELECT *" & vbCrLf & _
"FROM DateNTime_LU LEFT JOIN" & vbCrLf & _
" Query1 ON DateNTime_LU.DID = Query1.BTime"
cmd.Parameters.Append cmd.CreateParameter("MinDate", adDate, adParamInput,,CDate("2003-03-03"))
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open cmd
Do Until rs.Eof
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
Set cmd.ActiveConnection = Nothing
Set cmd = Nothing
conn.Close
Set conn = Nothing
</code>Sv: LEFT JOIN mot Access?
Vet inte vilket sätt som är bäst.
Jag tror min variant filtrerar ju urvalet innan Joinen. På så sätt förre Joins behövs göras. Medans din kod är tvungen att filtrera efter joinen. KAn var bättre ur prestanda synpunkt at filtrera innan tror jag.
Men det kan nog det kloka databas experterna eller några tester upplysa oss om. ;o)Sv: LEFT JOIN mot Access?
Sv: LEFT JOIN mot Access?
SELECT Kunder.*, Order.*
FROM Kunder INNER JOIN [Order] ON Kunder.Kundnr = Order.Kundnr AND Order.Anställningsnr = 1;
Fungerar inte. Men om man omger uttrycken i on vilkoret med parantes fungerar det. ;o)
SELECT Kunder.*, Order.*
FROM Kunder INNER JOIN [Order] ON (Kunder.Kundnr = Order.Kundnr AND Order.Anställningsnr = 1);
Vet inte om det alltid varit så. Hade nämnligen problem med fråger av denna typ i tidigare versioner av access. Då var jag tvungen att ha fält från tabellerna på varje sida av operatorn för at access skulle svälja frågan.
Tur att jag kollade upp det. Innan jag gjorde bort mig allt för mycket. ;o)Sv: LEFT JOIN mot Access?
//
Janne