Comment puis-je parcourir des pages filtrées distinctes?

J'ai la requête suivante:

SELECT DISTINCT TOP 20 f.id_service as f_id_service, f.id_city as f_id_city, f.name as f_name, f.address as f_address, f.business as f_business, f.web as f_web, f.phone as f_phone, f.id_firm as f_id_firm FROM Firm f left join Price p ON p.id_service = f.id_service AND p.id_city = f.id_city AND p.id_firm = f.id_firm WHERE f.blocked = '0' AND (f.name LIKE 'авто%' OR f.phone LIKE 'авто%') AND (f.phone != '' OR f.address != '') AND f.id_city = '73041' AND f.dogovor = '1' ORDER BY f.name ASC 

Cette requête montre TOP 20 lignes avec f.name unique

Quand j'ai besoin de sélectionner 20 prochaines rangées avec f.name unique, j'utilise la requête suivante:

 SELECT DISTINCT TOP 20 f.id_service AS f_id_service, f.id_city AS f_id_city, f.name AS f_name, f.address AS f_address, f.business AS f_business, f.web AS f_web, f.phone AS f_phone, f.id_firm AS f_id_firm FROM Firm f LEFT JOIN Price p ON p.id_service = f.id_service AND p.id_city = f.id_city AND p.id_firm = f.id_firm WHERE f.name NOT IN (SELECT DISTINCT TOP 20 f.name FROM Firm f WHERE f.blocked = '0' AND (f.name LIKE '????%' OR f.phone LIKE '????%') AND (f.phone != '' OR f.address != '') AND f.id_city = '73041' ORDER BY f.name ASC) AND f.dogovor = '1' AND f.blocked = '0' AND (f.name LIKE '????%' OR f.phone LIKE '????%') AND (f.phone != '' OR f.address != '') AND f.id_city = '73041' AND f.dogovor = '1' ORDER BY f.name ASC 

Mais je vois que dans la dernière requête j'interroge les lignes choisies avec f.name unique de la première requête.

Par exemple:

Première requête de résultat (select TOP 20 lignes): première requête

Résultat deuxième requête (select NEXT TOP 20 lignes): deuxième requête

Comment vous pouvez voir dans la seconde requête image deuxième ont des lignes de la première image (résultat première requête).

Dites-moi s'il vous plaît où erreur et comment écrire correctement?

Essaye celui-là –

 SELECT DISTINCT TOP 20 f.id_service AS f_id_service, f.id_city AS f_id_city, f.name AS f_name, f.[address] AS f_address, f.business AS f_business, f.web AS f_web, f.phone AS f_phone, f.id_firm AS f_id_firm FROM dbo.Firm f WHERE f.blocked = '0' AND (f.name LIKE 'авто%' OR f.phone LIKE 'авто%') AND f.phone + f.[address] != '' AND f.id_city='73041' AND f.dogovor='1' ORDER BY f.name SELECT * FROM ( SELECT DISTINCT f.id_service AS f_id_service, f.id_city AS f_id_city, f.name AS f_name, f.[address] AS f_address, f.business AS f_business, f.web AS f_web, f.phone AS f_phone, f.id_firm AS f_id_firm, row_id = ROW_NUMBER() OVER (ORDER BY f.name) FROM dbo.Firm f WHERE f.blocked = '0' AND (f.name LIKE 'авто%' OR f.phone LIKE 'авто%') AND f.phone + f.[address] != '' AND f.id_city='73041' AND f.dogovor='1' ) d WHERE d.row_id BETWEEN 21 AND 40 

quel collation utilisez-vous? c'est peut-être pourquoi les strings ne sont pas exclues par votre clause 'where f.name not in'

Lorsque vous select ce qui semble être un ID pour la table, vous pouvez vous passer du 'Distinct', ce qui vous permettrait de filterr les 20 premiers loggings par ID.

WHERE f.id_service NOT IN (SÉLECTIONNEZ TOP 20 f.id_service FROM Firm f WHERE f.blocked = '0' …

Tout d'abord, il peut s'agir d'une barrière de la langue, mais soyons clairs, votre première requête n'affiche pas de f.name unique mais des combinaisons uniques de toutes les colonnes.

Aussi, utiliser TOP et DISTINCT de cette manière est une très mauvaise idée. Il n'y a aucun moyen de s'assurer que vous obtiendrez les mêmes résultats à chaque fois.

Enfin, votre clause NOT IN est manquante AND f.dogovor='1'