Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Hjälp med en databasfråga

Postades av 2004-10-27 19:07:55 - Niclas Pettersson, i forum databaser, Tråden har 12 Kommentarer och lästs av 898 personer

Jag har tyvärr fastnat när jag ska ställa en fråga till en SQL 2000 databas.

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!


// Nicke


Svara

Sv: Hjälp med en databasfråga

Postades av 2004-10-27 19:14:24 - Pelle Johansson


Detta borde fungera:

<code>
select o.orderid, o.kundid
from order o, orderrad r
where o.orderid = r.orderid
and orderstatus=0
</code>


Svara

Sv: Hjälp med en databasfråga

Postades av 2004-10-27 22:02:55 - Per Johansson

Njae, om det han vill ha endast är kundid:n som Enbart har gjort misslyckade ordrar fungerar inte ovanstående.

Ä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 Johansson


Svara

Sv: Hjälp med en databasfråga

Postades av 2004-10-27 22:42:28 - Per Karlsson

Snyggare och effektivare sätt att åstadkomma detta:

<CODE>
SELECT KundId
FROM [tabell 1] t1, [tabell 2] t2
WHERE t1.orderid = t2.orderid
GROUP BY KundId
HAVING MAX(OrderStatus) = 0
</CODE>

/Pelle


Svara

Sv: Hjälp med en databasfråga

Postades av 2004-10-28 08:42:04 - Mikael Wedham

Och äntligen med ANSI-SQL...

<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>

/micke


Svara

Sv: Hjälp med en databasfråga

Postades av 2004-10-28 09:44:39 - Lars Berg

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.


Svara

Sv: Hjälp med en databasfråga

Postades av 2004-10-28 10:13:09 - Mikael Wedham

saxat från ANSI SQL-92 specifikationen

********************************************
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

/micke


Svara

Sv: Hjälp med en databasfråga

Postades av 2004-10-28 10:24:12 - Niclas Pettersson

Tack för all hjälp.

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!!!


Svara

Sv: Hjälp med en databasfråga

Postades av 2004-10-28 13:02:02 - Lars Berg

<citat>
... 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.


Svara

Sv: Hjälp med en databasfråga

Postades av 2004-10-28 16:15:17 - Niclas Pettersson

En snabb följdfrå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!

// N


Svara

Sv: Hjälp med en databasfråga

Postades av 2004-10-28 16:42:36 - Lars Berg

Jo, precis så. Where appliceras innan group by och having


Svara

Sv: Hjälp med en databasfråga

Postades av 2004-10-28 21:17:46 - Per Karlsson

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:

<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.

/Pelle


Svara

Sv: Hjälp med en databasfråga

Postades av 2004-10-28 22:55:23 - Per Persson

<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>

Och i MySQL används `backticks`.


Svara

Nyligen

  • 19:13 Международная перевозка грузов
  • 00:01 DL Van Tuning | Exclusive Body Kit
  • 12:08 Indian casino
  • 04:14 Vad finns det för kratomalternativ
  • 14:16 Indian online casino
  • 14:15 Indian online casino
  • 08:28 Butiksskyltar: Hur upplever utbude
  • 22:31 Slappna av

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 570 864
27 962
271 767
401
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies