---
title: "Avancerad SQL fråga"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/80530-avancerad-sql-fråga"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "hplarsson"
published: "2003-06-25T14:13:46.000Z"
updated: "2003-06-26T14:37:27.000Z"
replies: 4
views: 321
page: 1
pages: 1
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/80530-avancerad-sql-fråga"
---

# Avancerad SQL fråga

## #1 — hplarsson, 2003-06-25T14:13Z

Tjena!

Fick tips om detta forum, vi gör ett försök och kolla om någon kanske kan hjälpa mig...

Jag håller på att lösa ett SQL problem som var svårare att lösa än jag trodde.

Databasen ser ut som följer

\- groups, innehåller information om olika grupper
\- news, innehåller nyhetsinlägg, här finns en flagga som heter general, om den är satt så skall inlägget visas oavsatt vilken grupp man är inloggad i.
\- groups_news, är en länklista mellan groupid och newsid

Jag skall nu göra en lista på alla nyhetsinlägg som är relevanta för den inloggade personenen, som har valt vilken grupp han är med i, dess utom om ingen grupp är vald skall bara de generella inläggen visas. Denna lista skall vara sorterad DESC efter changedate som finns i tabellen news.

Om vi struntar i JOINS och CROSS JOINS och kör den gammla hedliga vägen, jag har testat JOINS, det funkar precis lika dant, så borde en sådan sats med inloggning i grupp med id 1 se ut något som

SELECT news.\* FROM news, group_news WHERE news.general = 1 OR group_news.newsid = news.newsid AND group_news.groupid = 1 ORDER BY news.changedate DESC

Denna sats funkar finfint till dess att man skaffar mer än ett inlägg som är kopplad till samma grupp, då börjar nämligen alla inlägg som är generella duplicera sig så många gånger som det finns gruppanknytna inlägg. Rent SQL mässigt/matematiskt är detta rätt, WHERE satsen utvärderas för varje inlägg vilket kommer resultera i detta.

Någon som kan komma på en rätt och riktig sats för att åstatkomma det jag vill??

Mvh
Hans-Petter "HP" Larsson

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

## #2 — agneta_rung, 2003-06-25T21:27Z

Så här:

```
SELECT * FROM news 
WHERE news.general = 1 
OR EXISTS 
  (SELECT * FROM group_news
  WHERE group_news.newsid = news.newsid 
  AND group_news.groupid = 1) 
ORDER BY news.changedate DESC
```

eller så här:

```
SELECT * FROM news 
WHERE news.general = 1 
OR news.newsid =  
  (SELECT newsid FROM group_news
  WHERE group_news.newsid = news.newsid 
  AND group_news.groupid = 1) 
ORDER BY news.changedate DESC
```

Vilket som är effektivast prestandamässigt beror nog på databashanterare. I SQLServer2000 är det EXISTS som gäller.

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

## #3 — LarsG, 2003-06-26T09:03Z

Frågorna är inte ekvivalenta eftersom = (subslect) innebär att subselecten får returnera högst ett värde.

Använd in (subselect) i stället.

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

## #4 — agneta_rung, 2003-06-26T09:57Z

LarsG har så rätt (i vanlig ordning)!!  :)

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

## #5 — hplarsson, 2003-06-26T14:37Z

Jag tackar för detta svar, det funkar!!!

Mvh
HP

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

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/80530-avancerad-sql-fråga
