geschachtelte abfrage oder join?

10/09/2009 - 17:59 von Martin | Report spam
hallo allerseits!
wie erstelle ich eine abfrage aus einer tabelle 'games' einer datenbank
'football' mit drei tabellen wie unten, die folgendes anzeigt:

Bremen Hamburg Weserstadium 01.07.2008 15:30 0 0

?
sollte ich die tabellen anders gestalten? oder làßt sich das machen?
danke für antwort!
Martin


CREATE TABLE [dbo].[Teams](
[ID] [int] IDENTITY(1,1) NOT NULL,
[NameFull] [nvarchar](50) COLLATE Latin1_General_CI_AS NOT NULL,
[NameAbbr] [nvarchar](50) COLLATE Latin1_General_CI_AS NOT NULL,
CONSTRAINT [PK_Teams] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

INSERT INTO [FootballTests].[dbo].[Teams]
([NameFull]
,[NameAbbr])
VALUES (N'Werder Bremen',N'Bremen')

INSERT INTO [FootballTests].[dbo].[Teams]
([NameFull]
,[NameAbbr])
VALUES (N'Hamburger SV', N'Hamburg')


CREATE TABLE [dbo].[Stadiums](
[ID] [int] IDENTITY(1,1) NOT NULL,
[CityAndName] [nvarchar](50) COLLATE Latin1_General_CI_AS NOT NULL,
CONSTRAINT [PK_Stadiums] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

INSERT INTO [FootballTests].[dbo].[Stadiums]
([CityAndName])
VALUES
(N'Weserstadion')


CREATE TABLE [dbo].[Games](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Team1] [int] NOT NULL,
[Team2] [int] NOT NULL,
[Stadium] [int] NOT NULL,
[TimeRegular] [datetime] NOT NULL,
[Result1] [int] NOT NULL,
[Result2] [int] NOT NULL,
CONSTRAINT [PK_Games] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

GO
ALTER TABLE [dbo].[Games] WITH CHECK ADD CONSTRAINT [FK_Games_Stadium]
FOREIGN KEY([Stadium])
REFERENCES [dbo].[Stadiums] ([ID])
GO
ALTER TABLE [dbo].[Games] WITH CHECK ADD CONSTRAINT [FK_Games_Team1]
FOREIGN KEY([Team1])
REFERENCES [dbo].[Teams] ([ID])
GO
ALTER TABLE [dbo].[Games] WITH CHECK ADD CONSTRAINT [FK_Games_Team2]
FOREIGN KEY([Team2])
REFERENCES [dbo].[Teams] ([ID])

INSERT INTO [FootballTests].[dbo].[Games]
([Team1]
,[Team2]
,[Stadium]
,[TimeRegular]
,[Result1]
,[Result2])
VALUES
(1, 2, 1, '1.7.2008 15:30', 0, 0)
 

Lesen sie die antworten

#1 Elmar Boye
10/09/2009 - 19:00 | Warnen spam
Hallo Marin,

Martin schrieb:
wie erstelle ich eine abfrage aus einer tabelle 'games' einer datenbank
'football' mit drei tabellen wie unten, die folgendes anzeigt:

Bremen Hamburg Weserstadium 01.07.2008 15:30 0 0

?



SELECT t1.NameFull, t2.NameFull, s.CityAndName, g.TimeRegular, g.Result1, g.Result2
FROM dbo.Games AS g
INNER JOIN dbo.Stadiums AS s ON s.ID = g.Stadium
INNER JOIN dbo.Teams AS t1 ON t1.ID = g.Team1
INNER JOIN dbo.Teams AS t2 ON t2.ID = g.Team2

sollte ich die tabellen anders gestalten?



Das sieht auf den ersten Blick gut normalisiert aus.
Ich würde an Deiner Stelle allerdings die Spalten,
die eine Fremdschlüssel ID enthalten, ebenfalls mit ID kennzeichen,
das macht es lesbarer und das erstellen von Anweisungen intuitiver.
Z. B. bei Games

CREATE TABLE [dbo].[Games](
[ID] [int] NOT NULL IDENTITY(1,1),
[TeamID1] [int] NOT NULL,
[TeamID2] [int] NOT NULL,
[StadiumID] [int] NOT NULL,
...

Als optionale Ergànzungen:
Da eine Mannschaft (üblicherweise) nicht gegen sich selbst
spielen kann, wàre ein CHECK auf Team1 <> Team2 sinnvoll.

Und einige UNIQUE Constraints auf die Namen, damit niemand
aus Versehen "Bayern München" zweimal anlegt ;-).

Gruß Elmar

Ähnliche fragen