2011-12-15 13 views
5

Mam pomysł, np. Mam tabelę zawierającą nazwę (Ann, Ben, Chris, Tom, John),
Chcę kwerendy go przy użyciu sql z list pierwszy, z ostatniego.Użyj zapytania SQL w celu, z wyjątkiem pierwszego rekordu

Ale mam warunek, że chcę umieścić Johna w pierwszej płycie.

+1

zgadzam się z bluefeet. Ponadto, jeśli ludzie nie odpowiedzą na twoje pytania, odpowiedz na nie sam. – Chris

+0

możliwy duplikat [sortowania według wartości - ORDER BY] (http://stackoverflow.com/questions/4138430/sorting-by-value-specific-order-by) – GSerg

Odpowiedz

19
select name 
from names 
order by 
    case when name = 'John' then 0 else 1 end, 
    name 
+1

+1 bez potrzeby używania 'UNION' –

+0

Czy sprawa jest szybsza niż gdzie + związek? Myślę, że przy dobrym wskaźniku, gdzie + związek może być szybszy. – Chris

+2

@aF, unikanie UNION nie jest celem samym w sobie, szczególnie jeśli można użyć 'UNION ALL', co zapobiega kosztownemu sprawdzaniu duplikatów. – Johan

2
(SELECT * FROM atable WHERE username = 'John') 
UNION ALL 
    (SELECT * FROM atable WHERE username <> 'John' ORDER BY username) 

Albo bardziej ogólnie:

(SELECT * FROM atable ORDER BY username DESC LIMIT 1) 
UNION ALL 
    (SELECT * FROM atable WHERE id NOT IN (
    SELECT id FROM atable ORDER BY username DESC LIMIT 1) 
    ORDER BY username) 

Jeśli masz uniknąć unii z jakiegoś powodu, to wolniej kod będzie również pracować:

SELECT * FROM atable 
ORDER BY 
    CASE WHEN id IN (SELECT id FROM atable ORDER BY username DESC LIMIT 1) 
    THEN 0 ELSE 1 END 
    , username 

W SQL serwera, na którym Składnia jest nieco inna, podzapytanie:

SELECT TOP 1 id FROM atable ORDER BY username DESC 
+0

nazwa użytkownika IS NULL? ;-) – wildplasser

+0

Czy nie potrzebujesz tu zewnętrznego zapytania do "SELECT" wyników "UNION"? – Yuck

+1

Biorąc pod uwagę brak zewnętrznego 'order by', serwer nadal może mieszać wiersze z dwóch związków. – GSerg

1

To proste:

(SELECT Name 
FROM Users 
WHERE Name = 'John') 
UNION ALL 
(SELECT * 
FROM Users 
WHERE Name <> 'John' 
ORDER BY Name) 
+2

Biorąc pod uwagę brak zewnętrznego 'order by', serwer nadal może mieszać wiersze z dwóch związków. – GSerg

+2

Zmień UNION na UNION ALL, łącząc dwa wzajemnie wykluczające się zestawy. – Johan

+0

Dwa razy wybierzesz użytkownika 'john'. – Johan

0

Złożenie oświadczenia przypadek w klauzuli ORDER BY nie działa z select odrębne. Uważam, że poniższe bardziej intuicyjne i działa, jeśli potrzebujesz również wybierz odrębne. Mimo to zwraca dodatkową kolumnę w zestawie wyników.

DECLARE @names TABLE 
(
    Name varchar(20) 
) 

INSERT INTO @names 
SELECT 'Tom' 

INSERT INTO @names 
SELECT 'John' 

INSERT INTO @names 
SELECT 'Chris' 

INSERT INTO @names 
SELECT 'Ann' 

INSERT INTO @names 
SELECT 'Ben' 

select Name, case when Name = 'John' then 1 else 0 end AS IsTopRow 
from @names 
order by IsTopRow DESC, Name 

Wyniki:

Name IsTopRow 
John 1 
Ann  0 
Ben  0 
Chris 0 
Tom  0 
Powiązane problemy