GRY-Online.pl --> Archiwum Forum

Zapytanie SQL - potrzebna pomoc

15.12.2006
13:30
[1]

Grzesiek [ - ! F a f i k ! - ]

Zapytanie SQL - potrzebna pomoc

Upraszczając mam tak:

SELECT
id,title,user,date,categoryId
FROM table
WHERE categoryId IN (@categoryId)
Order By date DESC

I ładnie wyświetlane są wszystkie rekordy wg data malejąco.

Teraz chciałbym, by rekordy o ID=1,2,33,43,100 zostały wyświetlone jako pierwsze przed pozostałymi (pierw 1,2,33,43,100, a później reszta) i wszystko wg daty malejąco. Jest na to jakiś sposób ?

15.12.2006
13:34
[2]

albz74 [ Legend ]

zrób 2 zapytania, najpierw ogranicz ID do wymienionych przez Ciebie, potem łącznik UNION potem drugie zapytanie dla ID różnych od wymienionych. Order by musi być osobno dla każdego zapytania

15.12.2006
13:38
[3]

albz74 [ Legend ]

czyli:

SELECT
id,title,user,date,categoryId
FROM table
WHERE categoryId IN (1,2,33,43,100)
Order By date DESC

UNION

SELECT
id,title,user,date,categoryId
FROM table
WHERE categoryId Not IN (1,2,33,43,100)
Order By date DESC

15.12.2006
13:40
[4]

diuk [ Generaďż˝ ]

Grzesiek --> taka potrzeba świadczy o źle zaprojektowanej strukturze :-) Nigdy nie powinno się nic usztywniać po konkretnym ID.
Możesz dodać dodatkową kolumnę z wymuszoną kolejnością wyświetlania, albo dodać tabelę w tymi ID, które mają być wyśw. wcześniej i odpowiednio złączyć.

15.12.2006
13:41
smile
[5]

Grzesiek [ - ! F a f i k ! - ]

Dzięki, zaraz spróbuję, bo moje zapytanie jest ciut bardziej złożone. Co prawda to się miało tyczyć ID, a nie categoryId, ale to żaden problem :)

diuk ---> potrzebna tego wyświetlania jest uzasadniona tym, że każdy użytkownik może określić sobie inne ID na początku. Jeśli chciałbym globalnie dla wszystkich to zrobić, to dodatkowa kolumna załatwiłaby sprawę.

15.12.2006
13:46
[6]

albz74 [ Legend ]

diuk - przeważnie piszący zapytania mają zerowy wpływ na strukturę :)
A takie ID to może być np typ faktury w SAP, więc czasami usztywnianie do raportów może być konieczne.

15.12.2006
13:48
[7]

diuk [ Generaďż˝ ]

Grzesiek --> "potrzebna tego wyświetlania jest uzasadniona tym, że każdy użytkownik może określić sobie inne ID na początku."

Tym bardziej powinna być dodtkowa tabela (<IdUsera><IdTegoCoMaBycNaPoczatku>) :-)
I to wiele-do-wielu.

15.12.2006
13:50
[8]

diuk [ Generaďż˝ ]

albz74 --> a potem - po wgraniu tego programu dla innego klienta - system nadaje inne IDy dla np. typu faktury i biegasz po kodzie, szukając dlaczego się wykłada :-)
Złe nawyki trzeba zwalczać :-)

15.12.2006
13:53
[9]

albz74 [ Legend ]

diuk - obawiam się że to w systemach ERP niemożliwe - zbyt wiele rzeczy jest narzuconych z góry a już o relacyjności to nikt nie marzy od samego początku :)

15.12.2006
14:05
[10]

Grzesiek [ - ! F a f i k ! - ]

Dobrze koledzy od początku.
Tabele sobie sam tworzę :)
Zapytanie jest walnięte do procedury i używane w aplikacji Asp.Net.

Ze względu na warunek
categorieId In (1,2,3,4) i wymogiem zparametryzowania tego procedura wygląda mniej więcej tak:

ALTER PROCEDURE ShowResult
@id_list varchar(100),
AS
Declare @sql as varchar(max)

SET @sql ='SELECT id,user,categoryId,date
FROM table1 Inner Join
table2 ON table1.id1 = table2.id2

GROUP BY ....
HAVING ...

(table3.categoryId IN (' + @id_list + '))
ORDER BY table2.date DESC'
exec(@sql)

RETURN

Tak na szybko uproszczona procedura (pominiętych kilka rzeczy). Rozwiązanie albz74 działa bardzo ładnie i jestem zadowolony :)

15.12.2006
14:16
[11]

diuk [ Generaďż˝ ]

Grzesiek --> a czemu tworzysz dynamiczne zapytanie?


15.12.2006
14:35
[12]

diuk [ Generaďż˝ ]

Grzesiek --> jeszcze jedno: co będzie, jak lista "tych pierwszych" będzie miała (wraz z przecinkami) więcej niż 100 znaków?

15.12.2006
14:50
[13]

[MiKu[ [ rapmuzik ]

Sorry Grzesiek, ale podlacze sie do Twojego tematu, ok? :) Mam pytanie, jaka ksiazke polecacie dla poczatkujacych z SQLem? Bo w szkole zaczelismy uczyc sie o 3 stopniach normalizacji i o podstawoych komendach sql, a chcialbym troche rozszerzyc swoja wiedze, bo na razie sa to banaly. Z gory dzieki za pomoc :)

pzdr

15.12.2006
14:54
[14]

Grzesiek [ - ! F a f i k ! - ]

diuk ---> Dzięki, że tak pomagasz :)

1. Nie będzie miała więcej niż 100 znaków.
2. Dynamiczne, ponieważ wprowadzenie parametru @id_list w ten sposób: 1,2,3,4,5 nie zwraca mi żadnych rekordów. Dopiero w ten sposób mogę otrzymać wynik. Dlaczego - nie wiem.

15.12.2006
15:10
[15]

albz74 [ Legend ]

Grzesiek - a jakiego typu jest pole categoryID ?

15.12.2006
15:11
[16]

Grzesiek [ - ! F a f i k ! - ]

Integer

15.12.2006
15:14
[17]

[MiKu[ [ rapmuzik ]

Lepiej to podbijac czy zalozyc nowy temat? :)

15.12.2006
15:32
smile
[18]

Grzesiek [ - ! F a f i k ! - ]

[MiKu[ ---> jest kilka pozycji wydawnictwa Helion.pl. Masz też duży zbiór wiedzy tuż pod łapami (google.pl). Możesz też poszukać e-booków odnośnie SQL na eMule'u :)

15.12.2006
15:34
[19]

albz74 [ Legend ]

Grzesiek - spotkałem się z takimi przypadkami że pole jest typu integer ale poszczególne wyniki i tak trzeba umieszczać 'w ciapkach'
czyli categoryID in ('1','2','3','4')

może tak zadziała ?

© 2000-2024 GRY-OnLine S.A.