Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[SQL] ROW_NUMBER() OVER probeem

Pagina: 1
Acties:

  • Swerfer
  • Registratie: Mei 2003
  • Laatst online: 19-11 21:48
Ik heb onderstaande select query welke prima werkt:
SQL:
1
2
3
4
5
SELECT
    ID,
    Name,
    ROW_NUMBER() OVER(ORDER BY Name) AS RowNumber
FROM Users

Nu heb ik de query iets aangepast met 'Name as test', zie onder, maar nu krijg ik de foutmelding 'Invalid column name 'test'
SQL:
1
2
3
4
5
SELECT 
    ID,
    Name as test,
    ROW_NUMBER() OVER(ORDER BY test) AS RowNumber
FROM Users

De 2e sql is maar een voorbeeld, mijn echte select is een regel of 40, maar ik moet gebruik maken van de 'column as xxx' verwijzing omdat ik onderstaande sql in mijn select heb waar ik moet kunnen sorteren op 'InTitle'
SQL:
1
2
3
4
CASE
WHEN Blaat like '%' + @SearchQuery + '%' THEN '0'
ELSE '1'
END as InTitle


Edit:

Onderstaande werkt, maar lijkt me niet de beste oplossing

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
WITH tempTable AS
(
SELECT 
    ID,
    Name as test
FROM Users
)
SELECT
    *,
    ROW_NUMBER() OVER(ORDER BY test) AS RowNumber
FROM
    tempTable

[ Voor 15% gewijzigd door Swerfer op 20-05-2013 13:42 ]

Home Assistant | Unifi | LG 51MR.U44 | Volvo EX30 SMER+ Vapour Grey, trekhaak | SmartEVSE V3 | Cronos Crypto.com


  • .KoenR
  • Registratie: Oktober 2012
  • Laatst online: 11:09
Swerfer schreef op maandag 20 mei 2013 @ 13:30:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
WITH tempTable AS
(
SELECT 
    ID,
    Name as test
FROM Users
)
SELECT
    *,
    ROW_NUMBER() OVER(ORDER BY test) AS RowNumber
FROM
    tempTable
In plaats van bovenstaande CTE is de enige andere optie je "Name" column als een cross apply mee te geven:

SQL:
1
2
3
4
5
6
SELECT
    ID,
    X.InTitle,
    ROW_NUMBER() OVER(ORDER BY X.InTitle) AS RowNumber
FROM Users
  cross apply ( select IIF(Blaat like '%' + @SearchQuery + '%', 0, 1) as InTitle ) as X

  • SKiLLa
  • Registratie: Februari 2002
  • Niet online

SKiLLa

Byte or nibble a bit ?

Jawel dat klopt; kolomnaam-aliassen zijn voor de buiten de subquery/cte, daarbinnen dien je de gewoon de orginele kolomnaam te gebruiken. Bijvoorbeeld:

SQL:
1
2
3
4
5
6
7
8
SELECT
    MyField as MyAlias
FROM
    MyTable
WHERE
    MyField > 1
ORDER BY
    MyAlias


PS: .KoenR: Vermoedelijk is de CROSS APPLY oplossing wel stukken (?) 'duurder' ...

'Political Correctness is fascism pretending to be good manners.' - George Carlin


  • .KoenR
  • Registratie: Oktober 2012
  • Laatst online: 11:09
Ik vermoed (maar dat is niet te controleren zonder de definitieve data) juist dat de cross apply voordeliger zal zijn in dit geval. Deze wordt altijd nog steeds maar 1x uitgevoerd per row. Mocht hij in dit geval het resultaat nodig hebben in zowel de ROW_NUMBER als een extra kolom moet deze toch 2x berekent worden.

  • SKiLLa
  • Registratie: Februari 2002
  • Niet online

SKiLLa

Byte or nibble a bit ?

Ik denk dat dat niet opweegt tegen de hoeveelheid data die de '40 regels' subquery meer moet verwerken nu het 'filter' zich buiten de subquery/cte bevindt en niet meer erbinnen. Althans, dat is mijn ervaring met grote datasets ...

'Political Correctness is fascism pretending to be good manners.' - George Carlin


  • Swerfer
  • Registratie: Mei 2003
  • Laatst online: 19-11 21:48
Ik denk dat ik vooralsnog voor mijn oplossing ga, omdat 'InTitle' niet de enige alias is. Er zijn er in totaal 8, wat dan een hoop 'CROSS APPLY' oplevert. (Wat voor mij overigens nieuw is).

Home Assistant | Unifi | LG 51MR.U44 | Volvo EX30 SMER+ Vapour Grey, trekhaak | SmartEVSE V3 | Cronos Crypto.com

Pagina: 1