Forum: SQL |
Thema:
Re: SELECT statement |
Von:
Daniel Röber (
10.01.2005 17:18) |
Hallo Marcus,
bevor Du weiter ueber dieses Problem gruebelst, solltest Du unbedingt Deine Tabellenstruktur ueberdenken, ich spiele hier direkt auf NORMALISIERUNG an, es gibt Hunderte, wenn nicht Tausended Hits bei Google, wenn Du danach suchst (NORMALISIERUNG SQL lang schon).
Grundsaetzlich wirst Du Dich mit der momentanen Struktur uebelst schwer tun, da Du pro Person nur ein Telefoneintrag zufuegen kannst, musst Du die jeweilige Person mehrmals in Deiner PERSONEN Tabelle einfuegen, um verschiedene Telefonnummern einer Peson zuzuweisen.
Vorschlag:
3 Tabellen
PERSONEN:
CREATE TABLE [Personen] (
[KontaktID] [int] IDENTITY (1, 1) NOT NULL ,
[Nachname] [nvarchar] (32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
[Vorname] [nvarchar] (32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
[Firma] [varchar] (32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
CONSTRAINT [PK_Personen] PRIMARY KEY CLUSTERED
(
[KontaktID]
) ON [PRIMARY]
) ON [PRIMARY]
GO
TELEFON:
CREATE TABLE [Telefon] (
[TelefonID] [int] IDENTITY (1, 1) NOT NULL ,
[TelefonNummer] [nvarchar] (16) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
[KontaktID] [int] NOT NULL ,
[TypeID] [smallint] NOT NULL ,
CONSTRAINT [PK_Telefon] PRIMARY KEY CLUSTERED
(
[TelefonID]
) ON [PRIMARY] ,
CONSTRAINT [FK_Telefon_Personen] FOREIGN KEY
(
[KontaktID]
) REFERENCES [Personen] (
[KontaktID]
),
CONSTRAINT [FK_Telefon_TelefonTyp] FOREIGN KEY
(
[TypeID]
) REFERENCES [TelefonTyp] (
[TypeID]
)
) ON [PRIMARY]
GO
TELEFONTYP:
CREATE TABLE [TelefonTyp] (
[TypeID] [smallint] IDENTITY (1, 1) NOT NULL ,
[Code] [nvarchar] (16) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
CONSTRAINT [PK_TelefonTyp] PRIMARY KEY CLUSTERED
(
[TypeID]
) ON [PRIMARY]
) ON [PRIMARY]
GO
Da Du spaeter weisst wieviele unterschiedliche TelefonTypen Du hast, koenntest Du folgendermassen abfragen (also des ist jetzt soweit die einfachste die ich gefunden habe):
SELECT P.Vorname
,P.Nachname
,ISNULL(P.Firma,' - ') AS Firma
,MAX(CASE WHEN T.TypeID = 1 THEN T.TelefonNummer ELSE ' - ' END) AS Privat
,MAX(CASE WHEN T.TypeID = 2 THEN T.TelefonNummer ELSE ' - ' END) AS Mobil
,MAX(CASE WHEN T.TypeID = 3 THEN T.TelefonNummer ELSE ' - ' END) AS Büro
,MAX(CASE WHEN T.TypeID = 4 THEN T.TelefonNummer ELSE ' - ' END) AS Fax
FROM Personen AS P
INNER JOIN Telefon AS T
ON P.KontaktID = T.KontaktID
GROUP BY
P.Vorname
,P.NachName
,Firma
ORDER BY P.VorName
Da waeren noch viele viele andere Moeglichkeiten ... bei weiteren Fragen ... einfach posten ... :P
HAPPY PROGRAMMiNG
DAN
Betreff |
Von |
Datum |
|
  |
Re: SELECT statement
Hi.<br>Die Tabellenstruktur ist leider in Stein gemeißelt, da sie aus einem CRM-System stammt. Natürlich könnte ich jetzt den Hersteller bitten, die Tabellensztruktur zu ändern, male mir da aber keine... |
 |
 |
 |
|
|
G.
Guest
|
18.02.2005 10:01 |
|
  |
Re: SELECT statement
Hi Marcus :-)<br><br>Man nehme mal zwei von deinen Tabellen. Personen und Telefon.<br><br>Personen (id, name, vorname)<br>Telefon (personenid, nummer, typ)<br><br>Als typ definiere ich mal 4 verschiedene: work,... |
 |
 |
 |
|
|
Thomas
Golla
|
18.02.2005 10:48 |
|
|
Antworten
Vorsicht bei der Eingabe: Die Zeichen ' oder -- sind nicht erlaubt!