---
title: "Post finns inte i relaterad tabell"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/71582-post-finns-inte-i-relaterad-tabell"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "i-or"
published: "2003-03-19T18:08:12.000Z"
updated: "2004-02-11T18:28:41.000Z"
replies: 24
views: 541
page: 1
pages: 2
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/databaser-sql/71582-post-finns-inte-i-relaterad-tabell"
---

# Post finns inte i relaterad tabell

_Sida 1 av 2._

## #1 — i-or, 2003-03-19T18:08Z

Jag har en SQL-fråga som förenklad ser ut så här:

```
SQL = "SELECT name FROM tabell1, tabell2 WHERE tabell1.name = tabell2.name AND tabell2.koll = 1"
```

Nu är det så att alla namn i t1 inte finns i t2. Men jag vill fortfarande att de ska skrivas ut.

Alltså, de som inte finns i tabell2 ska skrivas ut samt de som finns i tabell2 och har "koll"-värdet 1. De som finns i tabell2 och inte har "koll"-värdet ska inte skrivas ut.

Hur ska SQL-satsen se ut?

Permalänk: https://www.webforum.nu/p/71582

## #2 — Sebbe, 2003-03-19T18:12Z

```
strSQL = "SELECT tabell1.name, tabell2.name FROM tabell1 LEFT OUTER JOIN tabell2 ON tabell1.name = tabell2.name WHERE tabell2.koll = 1"
```

Kanske något sånt?

Permalänk: https://www.webforum.nu/p/983975

## #3 — i-or, 2003-03-19T18:16Z

Tyvärr så funkade inte det.

Den ger fortfarande bara ut de namn som finns i båda tabellerna.

Permalänk: https://www.webforum.nu/p/983987

## #4 — Sebbe, 2003-03-19T18:18Z

Kan det inte vara så att alla namn i tabell2 som har koll = 1 finns i tabell1 också?

Permalänk: https://www.webforum.nu/p/983988

## #5 — i-or, 2003-03-19T18:19Z

Jo, alla namn i tabell2 finns i tabell1 men inte tvärtom.

Permalänk: https://www.webforum.nu/p/983989

## #6 — @nders, 2003-03-19T18:21Z

Om alla i tabell2 finns i tabell1, varför blandar du in tabell1 överhuvudtaget?

```
SELECT * FROM tabell2 WHERE koll='1'
```

**red:** eller är det så att detta inte är din egentliga sql-fråga?

Permalänk: https://www.webforum.nu/p/983993

## #7 — LarsG, 2003-03-19T18:22Z

```
strSQL = "SELECT tabell1.name, tabell2.name FROM tabell1 LEFT OUTER JOIN tabell2 ON (tabell1.name = tabell2.name and tabell2.koll = 1)"
```

Permalänk: https://www.webforum.nu/p/983995

## #8 — i-or, 2003-03-19T18:33Z

Anders: Det stämmer, egentligen ska jag hämta ut en massa poster från tabell1 som inte är relaterade med tabell2.

LarsG: Det fungerade inte. SQL-satsen struntade i "tabell2.koll = 1"-kommandot.

Permalänk: https://www.webforum.nu/p/984011

## #9 — LarsG, 2003-03-19T18:45Z

Det verkar vara lite förbistring med avseende på vad du vill ha för resultat.

Visa lite exempeldata och vad du förväntar dig för resultat.

Permalänk: https://www.webforum.nu/p/984026

## #10 — i-or, 2003-03-19T18:53Z

I tabell1 lagras besökarnas träningspass och i tabell2 lagras besökarnas inställningar.

Det jag ska försöka göra med SQL-satsen är att lista de besökare som har lagt till träningspass den senaste veckan såvida de inte har valt i inställningarna att inte ha en offentlig träningsdagbok.

Exempel:

Tabell1:
Olle - 2003-03-19 - Löpning
Kalle - 2003-03-17 - Simning
Ulla - 2003-03-18 - Cykling
Kalle - 2003-03-17 - Löpning

Tabell2:
Ulla - inte offentlig
Kalle - offentlig

Listan över de som lagt till träningspass senaste veckan:
Olle (han har inte angett några inställningar och ska visas)
Kalle (han vill vara offentlig och ska visas)

Ulla ska inte visas.

Permalänk: https://www.webforum.nu/p/984035

## #11 — Sebbe, 2003-03-19T20:16Z

```
strSQL = "SELECT tabell1.namn, tabell2.namn FROM tabell1 LEFT OUTER JOIN tabell2 ON tabell1.namn = tabell2.namn WHERE tabell2.koll NOT IN ('0')"
```

Kanske funkar? Problemet är (tycker jag) att kollen ligger i tabell2.

Permalänk: https://www.webforum.nu/p/984088

## #12 — i-or, 2003-03-19T20:59Z

Tyvärr fungerade inte det heller.

Det känns väldigt dåligt att köra en SQL-sats för varje post i tabell1, men jag kanske är tvungen.

Permalänk: https://www.webforum.nu/p/984115

## #13 — aasah, 2003-03-20T09:07Z

Nu är jag säkert ute och cyklar men borde det inte vara så här:

SELECT tabell1.namn FROM tabell1, tabell2  WHERE 
tabell1.namn = tabell2.namn AND tabell2.koll='1';
union
(SELECT namn FROM tabell1
difference
SELECT namn FROM tabell2);

Det borde funka... men kan förmodligen skrivas bättre.

Permalänk: https://www.webforum.nu/p/984315

## #14 — i-or, 2003-03-20T10:07Z

Union? Difference?

Vad gör dem? Eftersom jag inte vet vad de gör var jag tvungen att skriv din SQL-sats ordagrant och då blev det fel. Jag antar att jag ska ändra någonting, typ att skriva ut någonting istället för "difference".

Permalänk: https://www.webforum.nu/p/984379

## #15 — aasah, 2003-03-20T13:27Z

Mitt fel! Byt difference mot except så funkar det nog.

(difference är ett annat språk än SQL och jag brukar vara bra på att blanda ihop uttrycken, förlåt! :r )

Om du använder SQL92 eller senare ska mängdoperatorer finnas med. De gör helt enkelt samma sak som de matematiska operatorerna U respektive \\. 

Exempel:
S = {Personer i 7A}
T = {Pojkarna i skolan}

S U T = Mängden av alla pojkar i skolan och dessutom alla flickor i 7A, dvs allting ur båda mängderna. 
S \\ T = Mängden av flickor i 7A, dvs allting ur S som inte finns i T.

Permalänk: https://www.webforum.nu/p/984445

## #16 — i-or, 2003-03-20T14:36Z

Det blev riktigt komplicerat det här.

Så här ser SQL-satsen ut i sin helhet:

```
SQL = "SELECT Max(t_diaryworkouts.f_date) AS f_date, t_diaryworkouts.f_runner, t_members.f_username FROM t_diaryworkouts, t_diarysettings, t_members WHERE t_members.f_id = t_diaryworkouts.f_runner AND t_diaryworkouts.f_runner = t_diarysettings.f_runner AND CURRENT_DATE - f_date < 7 AND t_diarysettings.f_who <> 1 GROUP BY t_diaryworkouts.f_runner, t_members.f_username ORDER BY f_date DESC, t_members.f_username"
```

 

Nu visas inte de löpare som inte finns i t_diarysettings.

Om jag lägger till:

```
UNION (SELECT f_runner FROM t_diaryworkouts EXCEPT SELECT f_runner FROM t_diarysettings)
```

Får jag detta felmeddelande:

\[TCX\]\[MyODBC\]You have an error in your SQL syntax near 'UNION (SELECT f_runner FROM t_diaryworkouts EXCEPT SELECT f_runner FROM t_diarys' at line 1

Vad är felet?

Permalänk: https://www.webforum.nu/p/984485

## #17 — aasah, 2003-03-20T19:45Z

Problemet är att kolumnerna inte matchar. I mitt exempel, fast rättat, har vi:

SELECT tabell1.namn FROM tabell1, tabell2 WHERE 
tabell1.namn = tabell2.namn AND tabell2.koll='1'; 
union 
(SELECT namn  FROM tabell1 
except 
SELECT namn  FROM tabell2); 

Dvs varje Select statement har lika många kolumner och av samma typ. Detta är oerhört viktigt. 

**Vänta ett tag!!** Du vill ha ut alla namn ur tabell1 som inte uttryckligen har sagt annat i tabell2. De som har sagt annat har koll = 0 i tabell2? Då kan det skrivas enklare!

SELECT namn FROM tabell1 
except 
SELECT namn FROM tabell2
where koll = 0;

I din fullständiga fråga måste du ha ovanstående som ett inre uttryck för att få kolumnerna att stämma. Så se till att ha:

SELECT Max(..) ... FROM ....
WHERE ... and t_diaryworkouts.f_runner in
( SELECT namn FROM tabell1 
except 
SELECT namn FROM tabell2
where koll = 0);

Permalänk: https://www.webforum.nu/p/984664

## #18 — aasah, 2003-03-20T19:46Z

Det här kom till av misstag: Jag tryckte citera i stället för redigera på mitt eget inlägg. Snälla ta bort! Och jag ber om ursäkt, det var inte meningen   :r

Permalänk: https://www.webforum.nu/p/984665

## #19 — i-or, 2004-02-11T15:35Z

Jag vet inte varför jag inte slutförde lösandet av ovanstående problem förra året. Men faktum är att det problemet kvarstår.

Jag försökte fixa problem med hjälp av aasahs exempel, men jag måste ha skrivit någonting fel.

```
SQL = "SELECT Max(t_diaryworkouts.f_date) AS f_date, t_diaryworkouts.f_runner, t_members.f_username FROM t_diaryworkouts, t_members WHERE t_members.f_id = t_diaryworkouts.f_runner AND f_date between adddate(current_date, interval -7 day) and current_date AND t_diaryworkouts.f_runner IN (SELECT f_runner FROM t_diaryworkouts EXCEPT SELECT f_runner FROM t_diarysettings WHERE f_who = 1) GROUP BY t_diaryworkouts.f_runner, t_members.f_username ORDER BY f_date DESC, t_members.f_username"
```

Vad är fel i SQL-satsen?

Det vore jätteschysst om någon kunde sätta sig in i problematiken och göra ett nytt försök.

Permalänk: https://www.webforum.nu/p/1273210

## #20 — LarsG, 2004-02-11T16:24Z

Det är inte fel i SQL satsen. Felet finns i Mysql som varken har stöd för except eller subselect. Jag återkommer.

Permalänk: https://www.webforum.nu/p/1273230

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/71582-post-finns-inte-i-relaterad-tabell  
Nästa sida: https://www.webforum.nu/amne/databaser-sql/71582-post-finns-inte-i-relaterad-tabell/page2.md
