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)
5 Réponses :
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
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 - i> et un commentaire multi-lignes est / * i> suivi de * / i> pas une seule citation ' I>, 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).
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
mettre le haut à l'extérieur de la requête de l'Union
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
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.
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) la différence est que la requête interne a un top 1 également et qui em> le top 1 peut être spécifié (comme indiqué). p> 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. P>