Jag har tyvärr fastnat när jag ska ställa en fråga till en SQL 2000 databas. Njae, om det han vill ha endast är kundid:n som Enbart har gjort misslyckade ordrar fungerar inte ovanstående. Snyggare och effektivare sätt att åstadkomma detta: Och äntligen med ANSI-SQL... Din fråga är lika mycket ANSI SQL som den som per skrev. Ingen är helt riktig eftersom main inte kan använda [] på det sätt som ni gör. saxat från ANSI SQL-92 specifikationen Tack för all hjälp. <citat> En snabb följdfråga: En liten komplettering av mitt tidigare lösningsförslag. Om man bara kollar att max(orderstatus) = 0 så missar man att kolla om det finns poster där orderstatus är mindre än 0. Detta kan undvikas på följande sätt: <b>Jag förutsåg inte att detta skulle starta en, om än intressant, diskussion om "" kontra [] runt tabellnamn som innehåller mellanrum mellan namnen.</b>Hjälp med en databasfråga
Jag har två tabeller:
<B>Tabell 1</B>
OrderID (PK)
KundID (FK)
.
.
<B>Tabell2</B>
OrderID (PK)
OrderStatus (int)
.
.
Låt för enkelhetens skull säga att
OrderStatus = 0 - Ej godkänd
Jag vill plocka ut alla KundID (DISTINCT) från Tabell1 som inte har någon godkänd OrderStatus i Tabell 2, någonsin.
Kunder som har gjort en eller flera godkända ordrar, men även en eller flera misslyckade ordrar, ska alltså inte listas. Bara de som endast har gjort misslyckade ordrar, OrderStatus = 0, ska listas.
Tacksam för förslag så att jag kan komma vidare!
// NickeSv: Hjälp med en databasfråga
Detta borde fungera:
<code>
select o.orderid, o.kundid
from order o, orderrad r
where o.orderid = r.orderid
and orderstatus=0
</code>Sv: Hjälp med en databasfråga
Även om det är helt otestat, så borde i alla fall principen fungera
<code>
select
distinct KundID
from
[Tabell 1] t1
join [Tabell 2] t2 on t1.OrderID = t2.OrderID
where
t2.OrderStatus = 0
and not exists (select 1
from [Tabell 1] t1b
join [Tabell 2] t2b on t1b.OrderID = t2b.OrderID
where t2b.StatusId <> 0 and t1.KundID = t1b.KundID)
</code>
/Per JohanssonSv: Hjälp med en databasfråga
<CODE>
SELECT KundId
FROM [tabell 1] t1, [tabell 2] t2
WHERE t1.orderid = t2.orderid
GROUP BY KundId
HAVING MAX(OrderStatus) = 0
</CODE>
/PelleSv: Hjälp med en databasfråga
<code>
SELECT KundId
FROM [tabell 1] t1 INNER JOIN [tabell 2] t2
ON t1.orderid = t2.orderid
GROUP BY KundId
HAVING MAX(OrderStatus) = 0
</code>
/mickeSv: Hjälp med en databasfråga
Sv: Hjälp med en databasfråga
********************************************
7.5 <joined table>
Function
Specify a table derived from a Cartesian product, inner or outer
join, or union join.
Format
<joined table> ::=
<cross join>
| <qualified join>
| <left paren> <joined table> <right paren>
<cross join> ::=
<table reference> CROSS JOIN <table reference>
<qualified join> ::=
<table reference> [ NATURAL ] [ <join type> ] JOIN
<table reference> [ <join specification> ]
<join specification> ::=
<join condition>
| <named columns join>
<join condition> ::= ON <search condition>
<named columns join> ::=
USING <left paren> <join column list> <right paren>
<join type> ::=
INNER
| <outer join type> [ OUTER ]
| UNION
<outer join type> ::=
LEFT
| RIGHT
| FULL
<join column list> ::= <column name list>
***********************************************
Visserligen funkar tabell, tabell ochså, men den har BRISTER och tonas ner till förmån för INNER JOIN.
Man kan visst använda [ ] på det sättet. Vad menar du?
Enligt ANSI skall man inte ha <space> i tabellnamn o.dyl. Så det blir ju en uppenbar workaround för att kunna använda tabeller som heter Tabell 1
/mickeSv: Hjälp med en databasfråga
Jag gjorde ett litet fel när jag redovisade tabellerna
De skulle naturligtvis vara så här:
Tabell 1
OrderID (PK)
KundID (FK)
Tabell 2
ID (PK)
OrderID (FK)
OrderStatus (int)
... men det verkade inte påverka svaret
Jag använde frågan som Micke skrev och den gav önskat resultat.
Nu kommer jag vidare i mitt lilla projekt.
Första gången jag ställer en fråga i detta forum och så många som vill hjälpa, IMPONERANDE!!! Sv: Hjälp med en databasfråga
... tonas ner till förmån för INNER JOIN.
</citat>
inte i standardspecifikationen.
<citat>
Man kan visst använda [ ] på det sättet. Vad menar du?
[</citat>
Enligt SQL-standard så används " för att ange namn som kan innehålla space och liknande
Om du har en tabell som heter table 2 så skall man använda följande
<code>
select * from "table 2"
</code>
[] används för att ange index när använder arrayer.Sv: Hjälp med en databasfråga
Om jag har ett datum i Tabell_1 och jag vill begränsa resultatet att bara gälla KundID:n som lagt sin order tidigare än ett visst datum.
Kan man då skriva något sådant här
SELECT KundId
FROM Tabell_1 t1 INNER JOIN Tabell_2 t2
ON t1.orderid = t2.orderid
WHERE t1.OrderDatum < [ett visst datum]
GROUP BY KundID
HAVING MAX(t2.OrderStatus)= 0
eller blir det tokigt??? Jag behöver inte hjälp med syntaxen utan snarare om en "WHERE" sats ger önskat resultat när man "joinar" och använder "HAVING" och "GROUP BY" som jag inte riktigt behärskar. Kan man överhuvudtaget använda det? Hur hade ni gjort om man vill slänga in ytterliggare vilkor på Tabell_1?
Mina namn på tabellerna var bara exempel för att visa min tabellstruktur på ett så enkelt sätt som möjligt. De heter något helt annat i min databas.
Jag förutsåg inte att detta skulle starta en, om än intressant, diskussion om "" kontra [] runt tabellnamn som innehåller mellanrum mellan namnen. My fault!
// NSv: Hjälp med en databasfråga
<CODE>
SELECT KundId
FROM tabell1 t1, tabell2 t2
WHERE t1.orderid = t2.orderid
GROUP BY KundId
HAVING MAX(OrderStatus) = 0 AND MIN(OrderStatus) = 0
</CODE>
Sen kan man ju använda inner join-syntaxen om man vill, men den tillför ingenting alls i det här fallet. Inner join-syntaxen är däremot mycket praktisk om man kombinerar joinar av olika typer.
/PelleSv: Hjälp med en databasfråga
Och i MySQL används `backticks`.