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


SQL: Lägga till kolumn som anger om värden finns i annat resultatset

Postades av 2004-10-16 17:00:22 - Jonas Österlöf, i forum databaser, Tråden har 23 Kommentarer och lästs av 1718 personer

Hej!

Det känns som att jag är riktigt korkad nu, kan kanske bero på den utmärkta Oktoberfest-ölen jag drack igår?
;-)

Jag joinar ett antal tabeller och vill till resultatet addera en kolumn som anger huruvida ett värde i en kolumn finns i en annan (kopplings)tabell. Om vi inte låtsas om joinarna kan vi säga att det ser ut såhär:

Ordrar
---------------
OrderID (PK)
ArtikelID (FK)
OrderInfo


RestadeArtiklar
-----------------
OrderID (FK)
ArtikelID (FK)

Nu skulle jag vilja få ut ett resultat som ser ut typ såhär:

OrderID|OrderInfo|ArtikelID|Restnoterad
-------------------------------------------
1223 |Qwertyuioi|3223 | True
1223 |Asdfghjklö|3224 | False
1224 |Zxcvbnm,.|3223 | False
1224 |Åpoiuytrew|3224 | False

OrderID, OrderInfo och ArtikelID skulle alltså komma ut från tabellen Ordrar (som i själva verket är resultatet från en jon med diverse tabeller jag inte listat). Kolumnen Restnoterad skulle ange huruvida respektive posts ArtikelID från den tabellen (joinen) finns med i tabellen RestadeArtiklar.

Några tips på hur jag skulle kunna skapa/addera kolumnen Restnoterad?
Jag använder MS SQL Server 7.

mvh
/Jonas


Svara

Sv: SQL: Lägga till kolumn som anger om värden finns i annat resultatset

Postades av 2004-10-16 19:47:56 - Per Persson

Så här kanske?
<code>
SELECT OrderID, ArtikelID, OrderInfo,
(OrderID IN (SELECT OrderID FROM RestadeArtiklar WHERE RestadeArtiklar.ArtikelID =
Ordrar.ArtikelID)) AS Restnoterad
FROM Ordrar
</code>


Svara

Sv: SQL: Lägga till kolumn som anger om värden finns i annat resultatset

Postades av 2004-10-16 21:42:31 - Jonas Österlöf

Hej Per!

Jag får tyvärr inte SQL Server 7 att acceptera syntaxen. Den gillar inte konstruktionen med "ORDERID IN".

Nu har jag i o f s löst problemet, genom att köra två queries, loopa igenom resultatet och addera kolumnen i min C#-kod istället. Men jag har ändå en gnagande känsla av att jag gjort ungefär det här med SQL förr, så jag tar gärna emot fler tips!

mvh
/Jonas


Svara

Sv: SQL: Lägga till kolumn som anger om värden finns i annat resultatset

Postades av 2004-10-16 21:46:09 - Gert Lindholm

Order är ett reserverat ord i SQL. Döp om det eller använd ""


Svara

Sv: SQL: Lägga till kolumn som anger om värden finns i annat resultatset

Postades av 2004-10-16 22:10:42 - Jonas Österlöf

Hej Gert!
Det är tyvärr inte problemet. (Ordet order används f.ö. ingenstans i queryn... :-)
mvh

/Jonas


Svara

Sv: SQL: Lägga till kolumn som anger om värden finns i annat resultatset

Postades av 2004-10-16 23:12:41 - Per Karlsson

Det "rätta" sättet att åstadkomma detta sql-mässigt borde vara med en left join:
<CODE>
SELECT O.OrderID, O.OrderInfo, O.ArtikelID,
CASE WHEN R.ArtikelID IS NULL THEN 0 ELSE 1 END RestNoterad
FROM Ordrar O LEFT JOIN RestadeArtiklar R ON R.ArtikelID = O.ArtikelId AND R.OrderID = O.OrderID
ORDER BY OrderID, ArtikelID
</CODE>

Denna sql-sats returnerar 1 eller 0 i kolumnen restnoterad, vilket är att rekommendera om man använder boolska värden i sql.

/Pelle


Svara

Sv: SQL: Lägga till kolumn som anger om värden finns i annat resultatset

Postades av 2004-10-16 23:16:30 - Per Persson

Borde inte <b>CASE WHEN R.ArtikelID IS NULL THEN 0 ELSE 1 END</b> lika gärna kort och gott kunna skrivas <b>R.ArtikelID IS NOT NULL</b>?


Svara

Sv: SQL: Lägga till kolumn som anger om värden finns i annat resultatset

Postades av 2004-10-17 15:55:50 - Lars Berg

Förvisso, om SQL server hade haft stöd för datatypen boolean.


Svara

Sv: SQL: Lägga till kolumn som anger om värden finns i annat resultatset

Postades av 2004-10-17 18:07:13 - Per Persson

Så det fungerar inte som i MySQL? Där representeras booleska värden av talen 0 och 1, så att skriva t.ex. <b>SELECT 5 > 3;</b> ger talet 1 som resultat och <b>R.ArtikelID IS NOT NULL</b> skulle ge talet 1 om R.ArtikelID inte är null och talet 0 om R.ArtikelID är null.


Svara

Sv: SQL: Lägga till kolumn som anger om värden finns i annat resultatset

Postades av 2004-10-17 20:10:01 - Lars Berg

Nej, det fungerar inte som i Mysql och tur är väl det. Den bristfälliga typhanteringen i Mysql ger upphov till en hel del fel.


Svara

Sv: SQL: Lägga till kolumn som anger om värden finns i annat resultatse

Postades av 2004-10-17 20:53:13 - Per Persson

Men även möjligheter... Kan du ge exempel på när det ger upphov till fel?

Om man som jag är van vid C, borde man inte ha några problem med MySQLs typhantering.

Jag tycker att det är litet sjukt om MSSQL stödjer booleska uttryck (t.ex. i WHERE-delar) men inte kan exportera booleska värden.


Svara

Sv: SQL: Lägga till kolumn som anger om värden finns i annat resultats

Postades av 2004-10-17 22:14:05 - Per Karlsson

När man lagrar boolska värden i MSSQL kan man använda datatypen BIT. Denna har värdena 1 respektive 0. Däremot är detta inte samma sak som true och false i uttryck i sql-satsen.


Svara

Sv: SQL: Lägga till kolumn som anger om värden finns i annat resultat

Postades av 2004-10-17 22:41:02 - Per Persson

Kan du ge något exempel på när det blir fel med MySQLs "bristfälliga" typhantering?


Svara

Sv: SQL: Lägga till kolumn som anger om värden finns i annat resulta

Postades av 2004-10-18 10:56:51 - Lars Berg

Mysql tycker att den 30:e februari är ett giltigt datum.
Om man försöker stoppa in en sträng i en numerisk kolumn så lagras värdet 0 istället för att ge fel.
Aritmetik för typen decimal ger avrundningsfel eftersom alla beräkningar görs med float.
Man får felaktigt resultat vid heltalsdivison.
Man kan jämföra kolumner som det inte är relevant att jämföra vilket kan ge oväntade resultat.
Generellt så går det att skriva SQL-satser som är nonsens ur en semantisk aspekt.


Svara

Sv: SQL: Lägga till kolumn som anger om värden finns i annat result

Postades av 2004-10-18 11:47:24 - Per Persson

<b>Mysql tycker att den 30:e februari är ett giltigt datum.</b>

Oj, det gillade jag inte.



<b>Om man försöker stoppa in en sträng i en numerisk kolumn så lagras värdet 0 istället för att ge fel.</b>

Inte nödvändigtvis talet 0. Stoppar man in '123abc' lagras talet 123. Detta kan vara användbart, även om man kanske hellre markerar konverteringen genom en konverteringsoperator.



<b>Aritmetik för typen decimal ger avrundningsfel eftersom alla beräkningar görs med float.</b>
<b>Man får felaktigt resultat vid heltalsdivison.</b>

Det låter inte bra. Kan du ge exempel?



<b>Man kan jämföra kolumner som det inte är relevant att jämföra vilket kan ge oväntade resultat.</b>

Och varför skulle man göra detta?



<b>Generellt så går det att skriva SQL-satser som är nonsens ur en semantisk aspekt.</b>

Nonsens eller icke-nonsens om man accepterar automatiska typkonverteringar? (Precis som i PHP)


Svara

Sv: SQL: Lägga till kolumn som anger om värden finns i annat resul

Postades av 2004-10-19 13:00:14 - Lars Berg

4/5 skall ge 0 ger 0.8 i Mysql.

Att man kan få avrundningsfel när man summerar float-värden är inget konstigt.

<citat>
Och varför skulle man göra detta?
</citat>

T.ex. om du skriver fel kolumnnamn, dvs gör ett misstag.

<citat>
Nonsens eller icke-nonsens om man accepterar automatiska typkonverteringar?
</citat>

Det är strikt definierat i SQL-standarden när man måste använda explicit typkonvertering och dessa regler följs inte av Mysql.


Svara

Sv: SQL: Lägga till kolumn som anger om värden finns i annat resu

Postades av 2004-10-19 13:18:48 - Per Persson

<b>4/5 skall ge 0 ger 0.8 i Mysql.</b>

Det finns en operator DIV som man kan använda.


Har du någon länk till SQL-standarden?


Svara

Sv: SQL: Lägga till kolumn som anger om värden finns i annat res

Postades av 2004-10-20 07:50:26 - Kalle Dahlberg

Länk till ANSI SQL-92 standard:

http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt


Svara

Sv: SQL: Lägga till kolumn som anger om värden finns i annat re

Postades av 2004-10-20 09:51:03 - Per Persson

Tack, men jag hittar inget där om att division av heltal skall ge ett heltal...


Svara

Sv: SQL: Lägga till kolumn som anger om värden finns i annat r

Postades av 2004-10-20 11:22:00 - Lars Berg

Det där dokumentet är inaktuellt sedan länge. Det senaste standarden heter SQL 2003 och den gäller sen i mars i år.

Det som står i standarden angående division är att resultatypen är implementation-defined (vilket i sig är olyckligt). Programmeringsmässigt så brukar heltalsdivision ge ett heltal som resultat och så fungerar de flesta andra SQL-implementationer. Just detta att Mysql avviker från standard (t.ex hur || tolkas) gör det svårt för dem som vill skriva portabel SQL.


Svara

Sv: SQL: Lägga till kolumn som anger om värden finns i annat

Postades av 2004-10-20 12:20:11 - Per Persson

<b>Programmeringsmässigt så brukar heltalsdivision ge ett heltal som resultat</b>

Så vanligt tror jag inte att det är om man ser till antalet språk. De flesta i C-familjen gör det, men utanför C-familjen är det väl inte så vanligt?


Svara

Sv: SQL: Lägga till kolumn som anger om värden finns i annat

Postades av 2004-10-20 14:02:47 - Kalle Dahlberg

Jo. Men nästan ingen stöder väl den än i någon implementation? SQL Server 2000 är entry level ANSI SQL-92 compliant vad jag kan minnas.


Svara

Sv: SQL: Lägga till kolumn som anger om värden finns i annat

Postades av 2004-10-20 14:07:16 - Kalle Dahlberg

Är java i C-familjen? :)


Svara

Sv: SQL: Lägga till kolumn som anger om värden finns i anna

Postades av 2004-10-20 16:57:32 - Per Persson

Jo, Java tillhör det jag kallar C-familjen. Språken där har i grunden samma syntax: man använder { och } för satsblock, tilldelning (=) är en operator med ett värde, likhetsoperatorn har dubbla likhetstecken (==), if-satsen saknar ordet 'then', ...


Svara

Nyligen

  • 19:38 Rekommendera något intressant
  • 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

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 873
27 965
271 770
363
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