Vinnaren i pepparkakshustävlingen!
2010-06-28, 16:21
  #1
Medlem
Sitter med ett problem som gör mig minst sagt tokig
Som ett exempel har jag en massa joins och vill plocka med en substabells kommentarer till när man listar den andra tabellen. Koden nedan vilja ska generera följande:
Kod:
ID NameOfList Content
1 House Checking Fix water pipes, Paint Southern wall, Repair structure in kitchen, Repair flushnob in wc, Mount lamp in living room
2 CarInventory Fix broken lamp, Fill it up
4 FrigeContent Cheese, Milk, Butte, Bread, Jam, Mushrooms,Egg, Coffe, Cola zero

Och koden som skapar tabeller och innehåll finns nedan(det som jag inte lyckas är att få allt innehållet till en cell och sedan göra en drop på resten om det stiger över säg 4000tecken)
Så långt jag kommit är att göra en join och sedan tar det stopp. Notera den tomma posten på kylskåpet)

Kod:
CREATE TABLE [dbo].[list](
	[Id] [int] IDENTITY(1,1) NOT NULL,
	[NameOfList] [nvarchar](50) NULL,
 CONSTRAINT [PK_List] PRIMARY KEY CLUSTERED 
(
	[Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

SET IDENTITY_INSERT [dbo].[list] ON
INSERT [dbo].[list] ([Id], [NameOfList]) VALUES (1, N'House Checking')
INSERT [dbo].[list] ([Id], [NameOfList]) VALUES (2, N'CarInventory')
INSERT [dbo].[list] ([Id], [NameOfList]) VALUES (3, N'ComputerNotes')
INSERT [dbo].[list] ([Id], [NameOfList]) VALUES (4, N'FrigeContent')
SET IDENTITY_INSERT [dbo].[list] OFF


CREATE TABLE [dbo].[Notes](
	[Id] [int] IDENTITY(1,1) NOT NULL,
	[FkListId] [int] NOT NULL,
	[Comment] [nvarchar](1024) NULL,
 CONSTRAINT [PK_Notes] PRIMARY KEY CLUSTERED 
(
	[Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

SET IDENTITY_INSERT [dbo].[Notes] ON
INSERT [dbo].[Notes] ([Id], [FkListId], [Comment]) VALUES (1, 1, N'Fix water pipes')
INSERT [dbo].[Notes] ([Id], [FkListId], [Comment]) VALUES (2, 1, N'Paint Southern wall')
INSERT [dbo].[Notes] ([Id], [FkListId], [Comment]) VALUES (3, 1, N'Repair structure in kitchen')
INSERT [dbo].[Notes] ([Id], [FkListId], [Comment]) VALUES (4, 1, N'Repair flushnob in wc')
INSERT [dbo].[Notes] ([Id], [FkListId], [Comment]) VALUES (5, 1, N'Mount lamp in living room')
INSERT [dbo].[Notes] ([Id], [FkListId], [Comment]) VALUES (6, 2, N'Fix broken lamp')
INSERT [dbo].[Notes] ([Id], [FkListId], [Comment]) VALUES (7, 2, N'Fill it up')
INSERT [dbo].[Notes] ([Id], [FkListId], [Comment]) VALUES (8, 4, N'Cheese')
INSERT [dbo].[Notes] ([Id], [FkListId], [Comment]) VALUES (9, 4, N'Milk')
INSERT [dbo].[Notes] ([Id], [FkListId], [Comment]) VALUES (10, 4, N'Butter')
INSERT [dbo].[Notes] ([Id], [FkListId], [Comment]) VALUES (11, 4, N'Bread')
INSERT [dbo].[Notes] ([Id], [FkListId], [Comment]) VALUES (12, 4, N'Jam')
INSERT [dbo].[Notes] ([Id], [FkListId], [Comment]) VALUES (13, 4, N'Mushrooms')
INSERT [dbo].[Notes] ([Id], [FkListId], [Comment]) VALUES (14, 4, N'Egg')
INSERT [dbo].[Notes] ([Id], [FkListId], [Comment]) VALUES (15, 4, N'Coffe')
INSERT [dbo].[Notes] ([Id], [FkListId], [Comment]) VALUES (16, 4, N'Cola zero')
INSERT [dbo].[Notes] ([Id], [FkListId]) VALUES (17, 4)
SET IDENTITY_INSERT [dbo].[Notes] OFF

ALTER TABLE [dbo].[Notes]  WITH CHECK ADD  CONSTRAINT [FK_Notes_List] FOREIGN KEY([FkListId])
REFERENCES [dbo].[list] ([Id])
GO
ALTER TABLE [dbo].[Notes] CHECK CONSTRAINT [FK_Notes_List]
GO
Citera
2010-06-29, 14:42
  #2
Medlem
dethalvabarnets avatar
vilken databas är det och vad får du använda för att lösa problemet?
Citera
2010-06-29, 15:05
  #3
Medlem
gadzooxs avatar
Citat:
Ursprungligen postat av dethalvabarnet
vilken databas är det och vad får du använda för att lösa problemet?
Det där ser ut som T-SQL dvs MS SQL Server.


I så fall lär detta funka för SQL2005 och senare:
Kod:
select l.Id, l.NameOfList,
	(select Comment + ', ' from Notes where FkListId = l.Id FOR XML Path('')) AS [Content]
from list l
Citera
2010-06-29, 16:03
  #4
Medlem
dethalvabarnets avatar
samma sak fast med MYSQL bara för att jag håller på med det för tillfället(funkar ej i SQL SERVER dvs).
Kod:
select list.id,list.NameOfListgroup_concat(notes.comment separator ', 'content 
from 
list 
inner join notes 
on 
list.id=notes.fkListId 
where 
list.id notes.fkListId 
group by 
list.id
Citera
2010-06-30, 12:26
  #5
Medlem
Tack för hjälpen... det hjälpte mig
(jodå det var MS SQL2005 eller senare men det är alltid bra att lära sig för andra system också)
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback