6
votes

SQL Server Top 1

dans Microsoft SQL Server 2005 ou supérieur, je voudrais obtenir la première ligne et s'il n'y a pas de ligne de correspondance, renvoyez une ligne avec des valeurs par défaut.

SELECT TOP 1 * FROM Contact 
WHERE EXISTS(select * from contact)


0 commentaires

5 Réponses :


1
votes
IF EXISTS ( SELECT TOP 1 ID, Name FROM TableName )
 BEGIN
     SELECT TOP 1 ID, Name FROM TableName
 END
ELSE
 BEGIN
 --exists returned no rows
 --send a default row
 SELECT 0, ''
 END

4 commentaires

Il n'est pas très efficace de sélectionner les données deux fois, une fois dans la si et à nouveau pour le jeu de résultats. En outre, une ligne de ligne dans TSQL est - et un commentaire multi-lignes est / * suivi de * / pas une seule citation ', comme dans VB.


Désolé faisait vb.net comme je l'aidais à faire définitivement réaliser que, cependant - et / * commentaire * / va éditer.


@Km: Il n'est pas vraiment "en sélectionnant les données deux fois". Une requête existez fonctionne différente d'une requête régulière. Bien que je suis d'accord, il est moins efficace de le faire de cette façon, le coût de l'existence ici est de l'ordre d'une lecture ou de trois, peu importe la totalité de la table.


Pour plus de clarté, veuillez éditer votre message pour dire s'il existe (sélectionnez 1 sur Tableau) au lieu de dupliquer la requête (ce qui le rend éventuellement déroutant pour les gens, en particulier avec le sommet sans signification).



5
votes

Utilisation:

WITH query AS (
    SELECT t.id,
           t.name
      FROM TABLENAME t
    UNION ALL
    SELECT 0, 
           '')
  SELECT TOP 1
         x.id,
         x.name
    FROM query x
ORDER BY x.id DESC


0 commentaires

1
votes

mettre le haut à l'extérieur de la requête de l'Union x


0 commentaires

2
votes
CREATE TABLE #sample(id INT, data VARCHAR(10))

SELECT TOP 1 id, data INTO #temp FROM #sample
IF @@ROWCOUNT = 0 INSERT INTO #temp VALUES (null, null)
SELECT * FROM #temp

2 commentaires

Cela fonctionnera si vous insérez (0, '') comme l'utilisateur spécifie et non (NULL, NULL). Cependant, il y a beaucoup de traitement de travail / de base de données nécessaire pour créer et insérer dans une table Temp, la méthode consistant à mettre le top 1 dans l'extérieur d'une table dérivée avec une union, est beaucoup plus efficace. Il serait terrible d'avoir ceci dans la production où il est utilisé avec une fréquence élevée.


L'utilisation d'une table TEM coûte environ 200 lit plus que d'autres méthodes. Il est bon que les gens sachent que c'est possible, mais je pense que l'utilisation d'une table Temp devrait durer sur la liste de quiconque.



6
votes

Que se passe-t-il lorsque la table est très complète et que vous voudrez peut-être spécifier la ligne de votre top 1 à obtenir, telle que le prénom? La requête des poneys OMG retournera la mauvaise réponse dans ce cas si vous modifiez simplement la clause de la commande. Sa requête coûte également environ 8% de CPU de plus que cette modification (bien qu'elle ait des lectures égales) xxx

la différence est que la requête interne a un top 1 également et qui le top 1 peut être spécifié (comme indiqué).

Juste pour le plaisir, c'est une autre façon de le faire, ce qui fonctionne très étroitement à la requête ci-dessus (-15ms à + 30ms). Bien que ce soit plus compliqué que nécessaire pour une requête aussi simple, elle démontre une technique que je ne vois pas d'autres personnes SQL en utilisant très souvent. xxx


0 commentaires