När det gäller mina låtar, kan det vara ifrån en till tre författare. Jag kan inte ge dig en komplett lösning men troligen måste du använda dig av subqueries. Någonting i stil med följande alltså : Då försökte jag så här: Denna selectsats bör fungera (den är dock kanske inte helt optimal i alla situationer): Tyvärr, när jag körde din kod, så fick jag följande felmedelande: Det var jag som skrivit ett litet fel i joinvillkoret för Kategori->Sångtitlar. Hade helt enkelt använt fel kolumnnamn. Helt perfekt.Göra om denna SQL till dynamsikt, beroende på hur många
Mitt problem är att om det är mer än en författare, så visas alla fälten mer än en gång, med enda skillnaden att författarnamnen skilljer.
Så här skulle jag vilja ha det:
ArrNo Songtitel Kategori Album Namn(1) Namn(2) Namn(3) Hide Anteckningar
Om Namn(2) eller Namn(3) inte finns, så ville jag ha en tom post.
Så här ser min SQL ut idag.
<code>
SELECT t_SongTitlar.ArrNo,
t_SongTitlar.songtitel,
t_Kategori.Kategori,
t_Album.Album,
t_forfattare.namn,
t_SongTitlar.Stim,
t_SongTitlar.Hide,
t_SongTitlar.Anteck
FROM t_Kategori INNER JOIN
(t_Album INNER JOIN
((t_songtitlar LEFT JOIN t_songforfattare
ON t_songtitlar.ArrNo = t_songforfattare.ArrNo)
LEFT JOIN t_Forfattare
ON t_songforfattare.for_id = t_forfattare.for_id)
ON t_Album.CD_ID = t_SongTitlar.Album)
ON t_Kategori.Kat_ID = t_SongTitlar.Kategori
</code>
Hur bör jag ändra på denna SQL?Sv: Göra om denna SQL till dynamsikt, beroende på hur må
Select
Title
, (Select Name from [table] where ???) As Name1
, (Select Name from [table] where ???) As Name2
, (Select Name from [table] where ???) As Name3
From [Table]
Where ???Sv: Göra om denna SQL till dynamsikt, beroende på hur må
<code>
SELECT t_SongTitlar.ArrNo,
t_SongTitlar.Songtitel as Sångtitel,
t_Kategori.Kategori,
t_Album.Album,
(Select t_forfattare.Namn from t_forfattare where t_songtitlar.ArrNo = t_songforfattare.ArrNo) As Name1,
(Select t_forfattare.Namn from t_forfattare where t_songtitlar.ArrNo = t_songforfattare.ArrNo) As Name2,
(Select t_forfattare.Namn from t_forfattare where t_songtitlar.ArrNo = t_songforfattare.ArrNo) As Name3,
t_SongTitlar.Stim,
t_SongTitlar.Hide,
t_SongTitlar.Anteck
FROM t_Kategori INNER JOIN
(t_Album INNER JOIN
((t_songtitlar LEFT JOIN t_songforfattare
ON t_songtitlar.ArrNo = t_songforfattare.ArrNo)
LEFT JOIN t_Forfattare
ON t_songforfattare.for_id = t_forfattare.for_id)
ON t_Album.CD_ID = t_SongTitlar.Album)
ON t_Kategori.Kat_ID = t_SongTitlar.Kategori
</code>
och fick felet:
Server: Msg 512, Level 16, State 1, Line 1
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
Han hittar alltså att det är mera än en författare i vissa fall, men hur gör jag sedan?Sv: Göra om denna SQL till dynamsikt, beroende på hur må
SELECT s.ArrNo,
s.songtitel,
k.Kategori,
a.Album,
(SELECT TOP 1 namn FROM t_songforfattare INNER JOIN t_forfattare ON t_songforfattare.for_id = t_forfattare.for_id WHERE ArrNo = s.ArrNo ORDER BY t_songforfattare.for_id ASC) AS namn1,
(SELECT TOP 1 namn FROM t_songforfattare INNER JOIN t_forfattare ON t_songforfattare.for_id = t_forfattare.for_id WHERE ArrNo = s.ArrNo AND t_songforfattare.for_id > (SELECT TOP 1 for_id FROM t_songforfattare WHERE ArrNo = s.ArrNo ORDER BY for_id ASC) ORDER BY t_songforfattare.for_id ASC) AS namn2,
(SELECT TOP 1 namn FROM t_songforfattare INNER JOIN t_forfattare ON t_songforfattare.for_id = t_forfattare.for_id WHERE ArrNo = s.ArrNo AND t_songforfattare.for_id > (SELECT TOP 1 for_id FROM t_songforfattare WHERE ArrNo = s.ArrNo AND t_songforfattare.for_id > (SELECT TOP 1 for_id FROM t_songforfattare WHERE ArrNo = s.ArrNo ORDER BY for_id ASC) ORDER BY t_songforfattare.for_id ASC)) AS namn3,
t_SongTitlar.Stim,
t_SongTitlar.Hide,
t_SongTitlar.Anteck
FROM t_Kategori AS k
INNER JOIN t_songtitlar AS s
ON k.kategori = s.Kategori
INNER JOIN t_Album AS a
ON s.Album = a.CD_IDSv: Göra om denna SQL till dynamsikt, beroende på hur må
Server: Msg 107, Level 16, State 3, Line 1
The column prefix 't_SongTitlar' does not match with a table name or alias name used in the query.
Server: Msg 107, Level 16, State 1, Line 1
The column prefix 't_SongTitlar' does not match with a table name or alias name used in the query.
Server: Msg 107, Level 16, State 1, Line 1
The column prefix 't_SongTitlar' does not match with a table name or alias name used in the query.
Eftersom det fans utskrivet t_songtitlar, så försökte jag att ändra det till
nedanstående, men ändå fel (men det känns som om det är på rätt väg)
<code>
SELECT s.ArrNo,
s.songtitel,
k.Kategori,
a.Album,
(SELECT TOP 1 namn FROM t_songforfattare INNER JOIN t_forfattare ON t_songforfattare.for_id = t_forfattare.for_id WHERE ArrNo = s.ArrNo ORDER BY t_songforfattare.for_id ASC) AS namn1,
(SELECT TOP 1 namn FROM t_songforfattare INNER JOIN t_forfattare ON t_songforfattare.for_id = t_forfattare.for_id WHERE ArrNo = s.ArrNo AND t_songforfattare.for_id > (SELECT TOP 1 for_id FROM t_songforfattare WHERE ArrNo = s.ArrNo ORDER BY for_id ASC) ORDER BY t_songforfattare.for_id ASC) AS namn2,
(SELECT TOP 1 namn FROM t_songforfattare INNER JOIN t_forfattare ON t_songforfattare.for_id = t_forfattare.for_id WHERE ArrNo = s.ArrNo AND t_songforfattare.for_id > (SELECT TOP 1 for_id FROM t_songforfattare WHERE ArrNo = s.ArrNo AND t_songforfattare.for_id > (SELECT TOP 1 for_id FROM t_songforfattare WHERE ArrNo = s.ArrNo ORDER BY for_id ASC) ORDER BY t_songforfattare.for_id ASC)) AS namn3,
s.Stim,
s.Hide,
s.Anteck
FROM t_Kategori AS k
INNER JOIN t_songtitlar AS s
ON k.kategori = s.Kategori
INNER JOIN t_Album AS a
ON s.Album = a.CD_ID
</code>
felmedelande:
Server: Msg 245, Level 16, State 1, Line 1
Syntax error converting the nvarchar value 'Soft Rock' to a column of data type int.
Felet kan vara av den anledningen att kategori är en uppslagstabell till t_kategori, där datatypen är int,null.
Det innebärju att det finns en siffra i t_songtitlar som skall hämta sitt värde ifrån tabellen t_kategori.
Phu, hur gör jag nu?Sv: Göra om denna SQL till dynamsikt, beroende på hur må
<code>
SELECT s.ArrNo,
s.songtitel,
k.Kategori,
a.Album,
(SELECT TOP 1 namn FROM t_songforfattare INNER JOIN t_forfattare ON t_songforfattare.for_id = t_forfattare.for_id WHERE ArrNo = s.ArrNo ORDER BY t_songforfattare.for_id ASC) AS namn1,
(SELECT TOP 1 namn FROM t_songforfattare INNER JOIN t_forfattare ON t_songforfattare.for_id = t_forfattare.for_id WHERE ArrNo = s.ArrNo AND t_songforfattare.for_id > (SELECT TOP 1 for_id FROM t_songforfattare WHERE ArrNo = s.ArrNo ORDER BY for_id ASC) ORDER BY t_songforfattare.for_id ASC) AS namn2,
(SELECT TOP 1 namn FROM t_songforfattare INNER JOIN t_forfattare ON t_songforfattare.for_id = t_forfattare.for_id WHERE ArrNo = s.ArrNo AND t_songforfattare.for_id > (SELECT TOP 1 for_id FROM t_songforfattare WHERE ArrNo = s.ArrNo AND t_songforfattare.for_id > (SELECT TOP 1 for_id FROM t_songforfattare WHERE ArrNo = s.ArrNo ORDER BY for_id ASC) ORDER BY t_songforfattare.for_id ASC)) AS namn3,
s.Stim,
s.Hide,
s.Anteck
FROM t_Kategori AS k
INNER JOIN t_songtitlar AS s
ON k.Kat_Id = s.Kategori
INNER JOIN t_Album AS a
ON s.Album = a.CD_ID
</code>Sv: Göra om denna SQL till dynamsikt, beroende på hur må
Om du bara visste hur glad jag blev nu. Jag har själv försökt både länge och väl, men denna SQL var lite för komplex för mig.
Ett jättetack till dig.