2010-12-15 55 views
2

Je vais avoir une table sql nommée table VISIT.3 différentes valeurs distinctes de la même table

j'ai 3 colonnes

WORKSTATION, catégorie, BOUTON

1, 1, 1

1, 2, 3

1, 1, 2

2, 1, 1

2, 3, 1

2, 1, 2

Comment puis-je interroger cette table pour obtenir les valeurs distinctes pour chaque colonne dans une instruction de requête?

le résultat devrait être comme STH ..

WORKSTATION, CATÉGORIE, BOUTON

1, 1, 1

2, 2, 2

  • , 3, 3

Je peux le faire avec 3 requêtes différentes. Je me demande simplement si cela peut être fait dans une requête, car cela accélèrera le fonctionnement du programme.

+0

Pourquoi devrait-3 apparaître dans WOSKSTATION? –

+0

Avez-vous mesuré la performance actuelle? Est-ce vraiment quelque chose que vous avez vraiment besoin d'améliorer? –

+0

sry, mai b blanc ??? – william

Répondre

2

Essayer de le faire avec colonne par colonne est l'OMI une erreur; il suffit de faire en deux colonnes et choisir la colonne à l'appelant:

SELECT DISTINCT 'WS' AS [Col], WORKSTATION AS [Value] FROM VISIT 
UNION ALL 
SELECT DISTINCT 'CA' AS [Col], CATEGORY AS [Value] FROM VISIT 
UNION ALL 
SELECT DISTINCT 'BU' AS [Col], BUTTON AS [Value] FROM VISIT 

qui est plus ou moins identique à:

SELECT 'WS' AS [Col], WORKSTATION AS [Value] FROM VISIT 
UNION 
SELECT 'CA' AS [Col], CATEGORY AS [Value] FROM VISIT 
UNION 
SELECT 'BU' AS [Col], BUTTON AS [Value] FROM VISIT 

C'est alors un aller-retour, etc. Je d probablement utiliser un entier (peut-être même tinyint) pour la première colonne (avec le client devrait savoir que 1 correspond à WORKSTATION etc) plutôt qu'un varchar, mais ce qui précède est donné uniquement pour la saveur.


Modifier les commentaires; ce qui suit prend en compte:

  • y compris les différents types de données de l'union (conversion à un type commun)
  • utilisant sortes ordinales sur les données d'origine, de sorte entiers sont encore classés 1,2,10 (entier tri), non 1,10,2 (string tri)

TSQL:

DECLARE @VISIT TABLE (WORKSTATION int, CATEGORY varchar(10), BUTTON int) 
INSERT @VISIT VALUES (1,'1',1) 
INSERT @VISIT VALUES (1,'2',3) 
INSERT @VISIT VALUES (2,'1',2) 
INSERT @VISIT VALUES (10,'1',1) 
INSERT @VISIT VALUES (10,'3',1) 
INSERT @VISIT VALUES (10,'1',2) 

SELECT x.Col, x.Value 
FROM (
    SELECT CAST(1 as tinyint) AS [Col], ROW_NUMBER() over(order by WORKSTATION) 
    AS [Sort], CONVERT(varchar(20), WORKSTATION) AS [Value] FROM @VISIT 
    UNION 
    SELECT CAST(2 as tinyint) AS [Col], ROW_NUMBER() over(order by CATEGORY) 
    AS [Sort], CATEGORY AS [Value] FROM @VISIT 
    UNION 
    SELECT CAST(3 as tinyint) AS [Col], ROW_NUMBER() over (order by BUTTON) 
    AS [Sort], CONVERT(varchar(20), BUTTON) AS [Value] FROM @VISIT 
) x ORDER BY x.Col, x.Sort 
+0

ressemble beaucoup .. quand je cours j'ai eu l'erreur de conversion de varchar à tinyint. Quelle partie est tinyint ?? – william

+0

@william - sens; dans le code réel, j'aurais probablement 'CAST (1 comme tinyint) AS [Col]', 'CAST (2 comme tinyint) AS [Col]', 'CAST (3 comme tinyint) AS [Col]' au lieu de '' WS '' etc –

+0

je pense que la question .. je pourrais b bête, ce que je demande est .. les types de colonnes sont varchar et l'erreur dite erreur est survenue lors de la conversion à smallint .. – william

0

quelques idées ...

Deux pleine jointures externes:

SELECT DISTINCT w.workstation, c.category, b.button 
    FROM VISIT w FULL OUTER JOIN VISIT c ON (w.workstation = c.category) 
    FULL OUTER JOIN VISIT b ON (w.workstation = b.button OR c.category = b.button) 

pour Subqueries VISITE peut accélérer les choses aussi:

SELECT w.workstation, c.category, b.button 
FROM (SELECT DISTINCT workstation FROM VISIT) w 
FULL OUTER JOIN (SELECT DISTINCT category FROM VISIT) c 
      ON (w.workstation = c.category) 
FULL OUTER JOIN (SELECT DISTINCT button FROM VISIT) b 
      ON (w.workstation = b.button OR c.category = b.button) 

Ordonné si vous le souhaitez:

ORDER BY COALESCE(w.workstation, c.category, b.button)