webForumDet fria alternativet

två select

13 svar · 365 visningar · startad av Dino

DinoMedlem sedan sep. 20011 914 inlägg
#1

Ok, har då en tempurär tabell och behöver hjälp med hur två Select på den skall utformas.

1. En Select som tar ut vart femte art_id.

2. En Select som väljer TOP 5 från och med ett speifikt art_id. Har då testat med.

SELECT TOP 5 * FROM @tbl WHERE art_id >= @index

Men det funkar inte riktigt. @tbl kan ju ha genomlidigt en hel del sortering som kan ge detta utseende.

art_id
----------
32
1
54
43
278
266
2
23
61
70
43
67
177
132

Och då blir problemet att om @index är 54 då tas endast "54, 278, 266, 61, 70" ut istället för "54, 43, 278, 266, 2". Finns det någon enkel väg runt detta?

LarsGMedlem sedan dec. 200012 464 inlägg
#2

Det ser ut som om du skulle behöva ha ett sekvensnummer i din tabellvariabel.

Om du lägger till en kolumn (seqno) med identity så kan du ställa

select top 5 * 
  from @tbl
  where seqno > 
      (select seqno 
          from @tbl 
       where art_id > @index)
order by seqno

top utan order by betyder egentligen att du kan få vad som helst eftersom du inte kan förutsätta någon viss ordning i tabellen.

select * 
  from @tbl
 where seqno % 5 = 0
DinoMedlem sedan sep. 20011 914 inlägg
#3

Har lite problem med att skapa en kolumn. Testade med två nedan varianter men får fel, så lite hjälp där oxå kanske.

DECLARE @tbl table
(
   a_id int, 
   a_pName varchar(30),
   a_company varchar(30),
   a_seqno int IDENTITY(1,1)
)
SET IDENTITY_INSERT @tbl ON

INSERT INTO @tbl 
   SELECT 
          a_id,
          a_pName,
          a_company
   FROM Customer
   WHERE a_c_id = @c_id
SELECT 
          a_id,
          a_pName,
          a_company,
          IDENTITY(int, 1,1) AS a_seqno
   INTO @tbl
   FROM Customer
   WHERE a_c_id = @c_id
LarsGMedlem sedan dec. 200012 464 inlägg
#4

Vad får du för del då?

DinoMedlem sedan sep. 20011 914 inlägg
#5

På första får jag "Incorrect syntax near '@tbl'." Vilket motsvarar raden med SET IDENTITY_INSERT @tbl ON.

På andra får jag samma fel fast vid INTO @tbl.

LarsGMedlem sedan dec. 200012 464 inlägg
#6

Såvitt jag förstår så kan man inte sätta identity_insert för tabellvariabler.

Tycker inte att du behöver sätta det heller i detta fall

INSERT INTO @tbl (a_id,a_pName, a_company)
   SELECT 
          a_id,
          a_pName,
          a_company
   FROM Customer
   WHERE a_c_id = @c_id

select into används för att skapa en ny tabell så det fungerar inte att använda en tabellvariabel där.

Det verkar finnas lite begränsningar för hur tabellvariabler kan användas och jag ser ingen direkt förklaring till varför dessa begränsningar finns.

DinoMedlem sedan sep. 20011 914 inlägg
#7

Om jag inte sätter det så får jag "An explicit value for the identity column in table '@tbl' can only be specified when a column list is used and IDENTITY_INSERT is ON." vilket ju motsäger sig själv.

Hur kommer jag runt detta?

LarsGMedlem sedan dec. 200012 464 inlägg
#8

Hmm, du kanske kan använda funktionen identity när du gör fyller din tabellvariabel

INSERT INTO @tbl 
   SELECT 
          a_id,
          a_pName,
          a_company,
          identity(1,1)
   FROM Customer
   WHERE a_c_id = @c_id

Detta är inget som jag har använt själv så jag spånar lite.

DinoMedlem sedan sep. 20011 914 inlägg
#9

Nä, funktionen funkar inte eftersom jag inte kan använda INTO på @tbl.

LarsGMedlem sedan dec. 200012 464 inlägg
#10

Jaha, kan du ha en egen räknare då

declare @counter int
set @counter = 0

INSERT INTO @tbl 
   SELECT 
          a_id,
          a_pName,
          a_company,
         @counter = @counter + 1
   FROM Customer
   WHERE a_c_id = @c_id

eller du kanske måste återgå till en temptabell?

DinoMedlem sedan sep. 20011 914 inlägg
#11

Får detta fel på räknaren. "A SELECT statement that assigns a value to a variable must not be combined with data-retrieval operations."

DinoMedlem sedan sep. 20011 914 inlägg
#12

Ok, har fått lite hjälp av en Aaron Bertrand. Detta löser det hela.

DECLARE @tbl table
(
   a_id int,
   a_pName varchar(30),
   a_company varchar(30),
   a_seqno int IDENTITY(1,1)
)

INSERT INTO @tbl(a_id, a_pName, a_company)
   SELECT
          a_id,
          a_pName,
          a_company
   FROM Customer
   WHERE a_c_id = @c_id

Nu kan jag gå tillbaka till de lösningar du skrev i ditt första inlägg. Tack för hjälpen LarsG. :)

LarsGMedlem sedan dec. 200012 464 inlägg
#13

Det var ju samma som jag föreslog tidigare (13:29) tycker jag.
Vad är skillnaden?

DinoMedlem sedan sep. 20011 914 inlägg
#14

Skillnaden är att jag troligen drappats av total ordblindhet runt 13:29 snåret och uppfattade inte "(a_id,a_pName, a_company)" i ditt inlägg. *Slår mig själv i huvudet med en ca 40 cm hög lampa *

:r

129 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
126 ms — hämta tråd, inlägg och bilagor (db)