[SQL] distinct? group by? krijg em niet aan de praat

Pagina: 1
Acties:

  • oZy
  • Registratie: Juli 2001
  • Laatst online: 15:17
hoi, zit even met een lastige query..

wat ik nu heb:
code:
1
2
3
4
5
6
7
8
9
10
11
SELECT 
  DISTINCT nws_id, nws_edit, nws_create, nws_title, nws_cat_name 
FROM 
            tbl_mod_news    as n 
  LEFT JOIN tbl_mod_nws_cat as nc ON n.nws_cat_id = nc.nws_cat_id  
  LEFT JOIN tbl_security    as s  ON n.nws_id     = s.sec_item_id  
WHERE 
      ('10/9/2003' BETWEEN nws_start AND nws_end)
  AND (sec_group_id = '4') 
ORDER BY 
  nws_edit DESC
Zoals je ziet heb ik dus 3 tabellen, tbl_mod_news waar nieuws artikelen in staan, tbl_mod_nws_cat waar de nieuws categorieën in staan, en tbl_security waar toegangsrechten op groepsniveau in zijn aangegeven.

Deze query hierboven werkt prima, het probleem is dat er dus ook een nws_content veld is (datatype = text). Zodra ik deze in de query prop (achter 'nws_cat_name'), krijg ik deze fout:
code:
1
The text, ntext, or image data type cannot be selected as DISTINCT.
Ik heb het ook geprobeerd met GROUP BY, maar.. zelfde probleem.

Wat ik wil is niet zo super ingewikkeld.. met mn andere tabellen werkt het op vrijwel dezelfde manier, prima. Alleen dat 'text' veld verpest het in dit geval. Weet iemand een manier waarop ik dit wél in 1 nette query kan aanpakken? Bvd!

  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06-2025

Varienaja

Wie dit leest is gek.

Waarom die DISTINCT erbij? Laat eens weg, krijg je dat niet gewoon hetzelfde resultaat? (Moeilijk hoor.. queries lezen op een onbekend datamodel ;) )

Siditamentis astuentis pactum.


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Op text , ntext, blob velden kan je niet grouperen.

https://fgheysels.github.io/


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
whoami schreef op 09 October 2003 @ 19:03:
Op text , ntext, blob velden kan je niet grouperen.
en ook niet DISTINCT O-)

Waarom? Omdat in text, ntext 2+ Gb aan data kan (als ik me niet vergis). "effe" kijken of 'ie "gegrouped / gedistinct" kan worden is dan niet meer zo makkelijk ;) Voor blobs mag het al helemaal duidelijk zijn waarom dat is...

Je kunt overigens wel (mits je niet de hele tekst nodig hebt uit je textveld) iets als volgt gebruiken:

code:
1
2
3
select substring(myTextField,1,8000)
from MyTable
group by substring(myTextField,1,8000)


Zo haal je de eerste 8000 chars (=max geloof ik) op. Dit zou je kunnen uitbreiden door 2 x 8000 chars op te halen ofzo...

code:
1
2
3
select substring(myTextField,1,8000) as col1, substring(myTextField,8000,8000) as col2
from MyTable
group by substring(myTextField,1,8000), substring(myTextField,8000,8000)


In col1 staan dan de eerste 8000 chars, in col2 de volgende 8000...dit kun je dan natuurlijk ook uitbreiden tot nog meer...

/disclaimer/
Dit is effe uit het blote bolleke, ik heb geen flauw idee of het ook zou werken...

[ Voor 80% gewijzigd door RobIII op 09-10-2003 19:13 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Wezzie
  • Registratie: Maart 2001
  • Laatst online: 21-08 07:00
Met een For-each constructie zou je ook de juiste gegevens op kunnen halen. Tenminste zo heb ik het wel eens gedaan. Je moet dan eerst de uitkomst van je normale query in een cursor pompen. Deze kan je vervolgens makkelijker raadplegen.

Het is dan niet in één query maar het kan wel in stored procedure. Maar het resultaat is bijna hetzelfde. Ik heb misschien ook nog wel een voorbeeld hiervan in Ms-Sql maar dat heb ik zo niet bij de hand. Deze is een Oracle 8.1.7:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
procedure sp_getMessages3
    (nPageId in Number, MessageCur OUT MyRefCur)
    is
    nCountryId number;
    nDepartmentId number;
    CheckCount number;
    CURSOR C1 IS
    /*SELECT THE DEPARTMENTS FOR A COUNTRY*/
        SELECT DISTINCT COUNTRYDEPARTMENTCATEGORY.DEPARTMENTID
        FROM   COUNTRY , COUNTRYDEPARTMENTCATEGORY
        WHERE  ((COUNTRY.COUNTRYID = COUNTRYDEPARTMENTCATEGORY.COUNTRYID) AND
            (COUNTRY.COUNTRYID = nCountryId));
    /*THE LAST MESSAGE FOR A DEPARTMENT WHERE IT IS NOT A REACTION*/
    CURSOR C2 IS
    SELECT Message.*
    FROM   MESSAGE , COUNTRYDEPARTMENTPAGE
    WHERE  MESSAGE.PAGEID = COUNTRYDEPARTMENTPAGE.PAGEID
    AND    COUNTRYDEPARTMENTPAGE.DEPARTMENTID = nDepartmentId
    AND    MESSAGE.MESSAGEID NOT IN (SELECT REACTION.REACTIONID FROM REACTION)
    AND   ROWNUM <= 1;
    BEGIN
        /*SELECT IF THE PAGEID IS FOR A COUNTRY OR FOR A DEPARTMENT
        * 0 = FOR A DEPARMENT. 1 = FOR A COUNTRY*/
        SELECT COUNT(*) INTO CheckCount
        FROM PAGE, COUNTRY
        WHERE PAGE.PAGEID = COUNTRY.PAGEID
        AND PAGE.PAGEID = nPageId ;

        /*IF CheckCount = 0 THEN THE PAGE IS A DEPARTMENTPAGE*/
        IF (CheckCount = 0) THEN
            OPEN MessageCur FOR
                /*CODE FOR DEPARMENT MESSAGES, SELECTS THE LAST 6 MESSAGES FOR A SPECIFIC DEPARTMENT*/
                SELECT * FROM
                    (SELECT     MESSAGE.MESSAGEID, MESSAGE.MESSAGETITLE, MESSAGE.DESCRIPTION,
                                MESSAGE.DATE_TIME
                    FROM        MESSAGE
                    WHERE       (MESSAGE.PAGEID = nPageId)
                    AND         (MESSAGE.MESSAGEID NOT IN (SELECT REACTION.REACTIONID FROM REACTION))
                    ORDER BY    DATE_TIME)
                WHERE ROWNUM <= 6
                ORDER BY DATE_TIME DESC;
        ELSE
            /*EMPTY THE TEMPORARY TABLE*/
            DELETE FROM TEMPMESSAGE;
            COMMIT;
            /*CODE FOR COUNTRY MESSAGES*/
            SELECT  COUNTRY.COUNTRYID INTO nCountryId
            FROM  COUNTRY , PAGE
            WHERE  PAGE.PAGEID = COUNTRY.PAGEID AND
            PAGE.PAGEID = nPageId;

            /*LOOP THROUGH THE DEPARTMENTS FOR A SPECIFIC COUNTRY*/
            FOR DEP IN C1 LOOP
                nDepartmentId := DEP.DEPARTMENTID;
                /*GET THE MESSAGE FOR A DEPARTMENT
                DELETE FROM TEMPMESSAGE;*/
                FOR MES IN C2 LOOP
                    /*FILL THE TEMPORARY TABLE*/
                    INSERT INTO TEMPMESSAGE(MESSAGEID, MESSAGETITLE, DESCRIPTION, THREADID, EMPLOYEEID, PAGEID, DATE_TIME)
                    VALUES(MES.MESSAGEID, MES.MESSAGETITLE, MES.DESCRIPTION, MES.THREADID, MES.EMPLOYEEID, MES.PAGEID, MES.DATE_TIME);
                END LOOP;
            END LOOP;
        /*LOAD IT INTO A REF CURSOR */
        OPEN MessageCur FOR
            SELECT TEMPMESSAGE.MESSAGEID, TEMPMESSAGE.MESSAGETITLE, TEMPMESSAGE.DESCRIPTION,
                   TEMPMESSAGE.DATE_TIME
            FROM TEMPMESSAGE
            ORDER BY TEMPMESSAGE.DATE_TIME;
        END IF;
        COMMIT;
END sp_getMessages3;

  • oZy
  • Registratie: Juli 2001
  • Laatst online: 15:17
Varienaja schreef op 09 oktober 2003 @ 18:56:
Waarom die DISTINCT erbij? Laat eens weg, krijg je dat niet gewoon hetzelfde resultaat? (Moeilijk hoor.. queries lezen op een onbekend datamodel ;) )
Nee. Zonder die distinct krijg ik 'dubbele' records terug (waarom snap ik ook nie psies :Y))

whoami: bedankt, maar dat was me reeds opgevallen (vandaar mijn verzoek om een alternatief).

RobIII / Wezzie: tnx! zal ze es gaan proberen.

  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 20-08 21:53
Dit zou moeten werken, de resultaten van jouw huidige query (incl.GROUP BY of DISTINCT) joinen met de tabel met het text-veld:

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
SELECT x.nws_id, x.nws_edit, x.nws_create, x.nws_title, x.nws_cat_name, y.nws_content FROM
(
  SELECT DISTINCT nws_id, nws_edit, nws_create, nws_title, nws_cat_name
    FROM tbl_mod_news AS n 
      LEFT JOIN tbl_mod_nws_cat AS nc ON n.nws_cat_id = nc.nws_cat_id  
      LEFT JOIN tbl_security    AS s  ON n.nws_id     = s.sec_item_id  
    WHERE ('10/9/2003' BETWEEN nws_start AND nws_end)
          AND (sec_group_id = '4') 
) x INNER JOIN tbl_mod_news AS y ON x.nws_id=y.nws_id

ORDER BY 
  x.nws_edit DESC


getest onder MS-SQL-2000

[ Voor 8% gewijzigd door jvdmeer op 10-10-2003 13:59 . Reden: Had nws_content nog even nws_laptext genoemd ]

Pagina: 1