2009-02-17 6 views
0

J'ai une base de données où chaque ligne a un ID, une URL et un XML. Les ID sont uniques, mais la colonne URL peut avoir des doublons. J'ai besoin de toutes les URL, sans doublons, et pour chaque URL j'ai besoin de l'ID et du XML.SQL "group by" question - Je ne peux pas sélectionner chaque colonne

Si je ne demande que l'URL et l'Id, j'utilise la requête suivante:

select URL, max(ID) as ID from T1 group by URL 

Et tout fonctionne très bien.

Mais quand je veux aussi le XML, et j'utilise la requête suivante:

select URL, max(ID) as ID, XML from T1 group by URL 

Je reçois l'erreur suivante:

ISC ERROR CODE:335544569 
ISC ERROR MESSAGE: 
Dynamic SQL Error 
SQL error code = -104 
user name required 

Qu'est-ce que je fais mal?

Merci,

Dikla

Merci pour les réponses. Je veux ajouter une explication:
En cas d'URL dupliquées, peu importe lesquelles seront retournées. Mais je dois les obtenir sans doublons, même si le XML est différent entre les lignes. Est-ce possible?
Merci!

+0

« Mais je dois les obtenir sans doublons, même si le XML est différent » I Je suis curieux de savoir pourquoi vous avez besoin du XML, mais ne vous inquiétez pas qu'une URL dupliquée puisse avoir un XML différent sur chaque ligne dupliquée, et ainsi vous obtiendrez, en effet, le "choix randon" pour le XML récupéré – Kristen

+0

Ceci est dû au XML avoir des détails qui seront les mêmes pour les deux lignes, mais ils ne différeront que par les valeurs de date et d'heure dont je ne me soucie pas. – Dikla

Répondre

4
select id, url, xml 
from table1 
where id in (
    select min(id) 
    from table1 
    group by url) 

vous donnerait des lignes avec double urls enlevées (et seule la première instance de urls en double inclus)

+1

Cette requête donnera aussi les résultats qui ont des doublons (mais le premier des doublons).Si vous voulez seulement des urls sans doublon puis ajouter à la deuxième sélection: WHERE count (id) = 1 – klew

+0

@klew - Oui, vous avez raison. Comme j'ai compris la question, dikla veut toutes les URL de la table, mais ne veut pas lister les URL une seconde fois. –

+0

@klew - A la deuxième réflexion, si vous voulez UNIQUEMENT urls sans doublon, alors dikla devrait inclure une clause HAVING au lieu de la clause WHERE. Donc, la requête doit être: Sélectionnez id, url, xml de table1 où id dans (sélectionnez min (id) du groupe table1 par url HAVING count (id) = 1) –

0

Votre non effectuer une fonction d'agrégation sur la colonne XML, vous devez l'inclure dans votre groupe par. Rappelez-vous que si les données sont différentes pour chaque ligne, elles ne pourront pas être regroupées et vous n'obtiendrez pas les résultats que vous recherchez, que ce soit les résultats pour lesquels vous avez demandé la base de données :).

2

Vous devez relire votre question et y réfléchir.

Vous demandez des URL (qui peuvent être des doublons) mais vous ne voulez pas de doublons et vous voulez également l'ID (qui n'est pas dupliqué). Les données de l'échantillon:

1,http://www.google.com 
2,http://www.yahoo.com 
3,http://www.google.com 

Dans ce cas, qu'est-ce exactement voulez-vous revenir, en gardant à l'esprit qu'il ya plusieurs ID pour google?

Il en va de même pour le XML. Si ce n'est pas unique pour une URL donnée, vous devez spécifier comment obtenir une seule entrée par URL et c'est pourquoi votre requête ne fonctionne pas.

0
select urlMaxId.id, urlMaxId.url, table1.html from (select url, max(id) id from table1 group by url) urlMaxId inner join table1 on urlMaxId.id = table1.id