Avatar billede slapstick Nybegynder
08. juli 2004 - 12:19 Der er 19 kommentarer og
1 løsning

full outer join med mysql

jeg har to tabeller..

en der hedder services som indeholder: serviceid, servicetype, displayname, serviceurl, abouturl
og en der hedder userservices som indeholder: brugerid, serviceid, expiredate

jeg vil godt lave en full outer join så jeg får alle poster fra services tabellen og de poster fra userservices tabellen hvor brugerid er lige med 1125

jeg har prøvet med den her:

SELECT userservices.brugerid,userservices.serviceid,userservices.expiredate,services.serviceid,services.servicetype,services.displayname,services.serviceurl,services.abouturl FROM userservices FULL OUTER JOIN services ON userservices.serviceid = services.serviceid WHERE userservices.brugerid = 1125

men jeg får bare en syntax error fejl...
Avatar billede arne_v Ekspert
08. juli 2004 - 12:25 #1
Hm.

Jeg kan ikke se FULL OUTER JOIN i MySQL docs:
  http://dev.mysql.com/doc/mysql/en/JOIN.html
Avatar billede slapstick Nybegynder
08. juli 2004 - 12:31 #2
hmm ok har du en anden måde at lave det jeg vil ?
Avatar billede arne_v Ekspert
08. juli 2004 - 12:38 #3
Måske:

(SELECT * FROM tabel1 LEFT JOIN tabel2 ON tabel1.x = tabel2.x)
UNION
(SELECT * FROM tabel1 RIGHT JOIN tabel2 ON tabel1.x = tabel2.x WHERE tabel1.x IS NULL)

ikke kønt, men det er det bedste jeg kan finde på lige nu.
Avatar billede slapstick Nybegynder
08. juli 2004 - 13:20 #4
hmm sikkert mig der har fucket up men får en "-1 row affected" og "commands out of sync"
Avatar billede arne_v Ekspert
08. juli 2004 - 20:33 #5
Mystisk.

CREATE TABLE t1 (f1 INTEGER PRIMARY KEY,f2 VARCHAR(50));
CREATE TABLE t2 (f1 INTEGER PRIMARY KEY,f2 VARCHAR(50));
INSERT INTO t1 VALUES (1,'A');
INSERT INTO t1 VALUES (2,'BB');
INSERT INTO t2 VALUES (2,'BB');
INSERT INTO t2 VALUES (3,'CCC');
(SELECT * FROM t1 LEFT JOIN t2 ON t1.f1=t2.f1)
UNION
(SELECT * FROM t1 RIGHT JOIN t2 ON t1.f1=t2.f1 WHERE t1.f1 IS NULL);
DROP TABLE t1;
DROP TABLE t2;

giver hos mig:

f1      f2      f1      f2
1      A      NULL    NULL
2      BB      2      BB
0      NULL    3      CCC

hvilket ser rigtigt ud.
Avatar billede perkoch Nybegynder
09. juli 2004 - 05:08 #6
SELECT t0.brugerid, t0.serviceid, t0.expiredate, t1.serviceid, t1.servicetype, t1.displayname, t1.serviceurl, t1.abouturl FROM userservices t0 INNER JOIN services t1 USING(serviceid) WHERE brugerid = 1125
Avatar billede slapstick Nybegynder
09. juli 2004 - 10:22 #7
perkoch den returnerer kun de to poster hvor 1125 har entries :(

arne v: det var som sagt mig der havde kluntet i det jeg fik det til at spille tak :) smid et svar så får du point
Avatar billede arne_v Ekspert
09. juli 2004 - 10:35 #8
svar
Avatar billede jespersahner Nybegynder
28. december 2005 - 11:02 #9
->arne_v: Ser dit udmærkede eksempel helt tilfældigt.

Mht. VARCHAR returneres NULL, men mht. INTEGER returneres 0. Hvordan skelner man en missing INTEGER fra en INTEGER med værdien 0?
Avatar billede arne_v Ekspert
28. december 2005 - 11:39 #10
INTEGER kan også være NULL

SQL er anderledes end Java

hvis du tænker på query output 3. række 1. kolonne så er det en indtastnings fejl

mysql> CREATE TABLE t1 (f1 INTEGER PRIMARY KEY,f2 VARCHAR(50));
Query OK, 0 rows affected (0.01 sec)

mysql> CREATE TABLE t2 (f1 INTEGER PRIMARY KEY,f2 VARCHAR(50));
Query OK, 0 rows affected (0.03 sec)

mysql> INSERT INTO t1 VALUES (1,'A');
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO t1 VALUES (2,'BB');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO t2 VALUES (2,'BB');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO t2 VALUES (3,'CCC');
Query OK, 1 row affected (0.00 sec)

mysql> (SELECT * FROM t1 LEFT JOIN t2 ON t1.f1=t2.f1)
    -> UNION
    -> (SELECT * FROM t1 RIGHT JOIN t2 ON t1.f1=t2.f1 WHERE t1.f1 IS NULL);
+------+------+------+------+
| f1  | f2  | f1  | f2  |
+------+------+------+------+
|    1 | A    | NULL | NULL |
|    2 | BB  |    2 | BB  |
| NULL | NULL |    3 | CCC  |
+------+------+------+------+
3 rows in set (0.02 sec)

mysql> DROP TABLE t1;
Query OK, 0 rows affected (0.02 sec)

mysql> DROP TABLE t2;
Query OK, 0 rows affected (0.00 sec)
Avatar billede jespersahner Nybegynder
28. december 2005 - 12:36 #11
->arne_v: Jep, det er sandt. Men hvad nu når data overføres til Java (læsning via ResultSet osv.)? I så fald oversættes INTEGER=NULL vel til 0 i Java, og så er det ikke muligt at skelne?
Avatar billede arne_v Ekspert
28. december 2005 - 16:25 #12
rigtigt og forkert

eksempel:

        ResultSet rs = stmt.executeQuery("SELECT 0,NULL");
        if(rs.next()) {
            System.out.println(rs.getInt(1));
            System.out.println(rs.wasNull());
            System.out.println(rs.getInt(2));
            System.out.println(rs.wasNull());
        }

output:

0
false
0
true
Avatar billede arne_v Ekspert
28. december 2005 - 16:26 #13
[ikke alle databaser tillader SELECT uden en FROM men den her gør]
Avatar billede jespersahner Nybegynder
28. december 2005 - 17:12 #14
->arne_v: Interessant!

I SQL har man altså NULL (som både kan "optræde som" numerisk og karakter), hvilket man ikke har i Java.

Hvordan ville man i Java bære sig ad, hvis man skulle repræsentere NULL? Her har man f.eks. Double.NaN, som vel smager lidt af NULL, men man har ikke f.eks. Integer.NaN. Hvorfor egentlig ikke? Ville det ikke være naturligt at definere den største Integer som Integer.NaN og lade Integer.MAX_VALUE være 1 mindre (Double.NaN er vist i princippet 1 større end Double.MAX_VALUE)?
Avatar billede arne_v Ekspert
28. december 2005 - 17:21 #15
En oplagt mulighed var at bruge Integer fremfor int fordi den kan være null !
Avatar billede arne_v Ekspert
28. december 2005 - 17:26 #16
C# 2.0 har en elegant løsning på det

int v = null;

giver fejl, men:

int? v = null;

virker.

int? er en lille wrapper omkring int som gør at den kan være null, men alle
de normale operationer virker stadig

Java har desværre ikke noget tilsvarende.
Avatar billede jespersahner Nybegynder
29. december 2005 - 13:23 #17
->arne_v: Ja, elegant. Din bemærkning sendte mig lidt rundt på nettet til bla. LINQ..spændende, spændende.

Lad mig til sidst spørge dig:
1. Hvilket MS-software har man præcis brug for, hvis man vil arbejde med C#?
2. Har man i øvrigt mulighed for selv at tilføje funktionalitet til Java? (i forhold til Java-kompileren, tænker jeg). Det kunne f.eks. være egne operatorer mv.
Avatar billede arne_v Ekspert
29. december 2005 - 13:39 #18
re 1)

.NET runtime
.NET SDK
+optional en IDE

re 2)

Nej - Java understøtter ikke bruger definerede operatorer.
Avatar billede jespersahner Nybegynder
29. december 2005 - 16:41 #19
->arne_v: Tænker bare lige højt..

Med disse "Compiler Compiler"-programmer (f.eks. JavaCC) kan man vel (i princippet) skrive sin egen Java-compiler og dermed også inkludere nye operatorer etc.

Findes der "open-source" Java-compilere, hvor noget sådan faktisk er muligt?

(der findes f.eks. til SAS et produkt SAS/Toolkit - som i øvrigt er helt umuligt at anvende - men hvor tankegangen er, at man kan skrive sine egne SAS-procedurer og inkludere i SAS-sproget)
Avatar billede arne_v Ekspert
29. december 2005 - 17:24 #20
nu er procedurer notorisk nemmere at lave end operatorer

men principielt kunne du godt lave en SuperJava compiler som compilede en
udvidet Java syntax inklusive operatorer på egne klasser til standard Java
byte kode

jeg tror ikke at det er helt simpelt

og slet ikke moderne

det er AOP der er mest fokus på med hensyn til udvidelser til Java - og så
script udvidelser a la Groovy/Jython
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester