Kniffliges SQL-statement...

Poleander

Neuer Benutzer
Beiträge
3
Hallo liebes Forum,

ich habe folgendes Problem, an dem ich langsam verzweifle...

gegeben sind zwei Tabellen:
Tabelle Main mit folgenden Spalten
id -> Primärschlüssel
id_titel -> Fremdschlüssel von Titel.id

Tabelle Titel
mit folgenden Spalten
id -> Primärschlüssel
titel


gesucht ist folgendes statement:
in Tabelle Titel soll geprüft werden, ob ein eingehender String bereits in der Spalte titel existiert
-> wenn ja, so soll die id dieses titels in der Tabelle Main unter id_titel eingetragen werden

-> wenn nicht, so soll in Spalte titel (Tabelle Titel) ein neuer Eintrag vorgenommen werden und die id (von Tabelle Titel) des neues Eintrages in id_titel von Tabelle Main eingetragen werden.


'e bissel Plan habe ich von SQL, doch dieses Statement macht mich alle... :-(

für Ratschläge, Lösungsansätze, Lösungsvorschläge bin ich sehr dankbar

beste Grüße
Poleander
 
Werbung:
AW: Kniffliges SQL-statement...

das Problem besteht weiterhin... ich hab mich nochmal d'ran gesetzt, krieg' aber nur 'nen Knoten im Hirn... und auf'm Zettel... selbst 'ne Pulle Wein hat da nicht viel ausrichten können...
 
AW: Kniffliges SQL-statement...

deine Tabelle main macht überhaupt keinen Sinn, bzw. Sie hat keinen Zweck! Ansonsten lässt sich das Problem nicht ohne weiteres mit SQL lösen, da musst du schon ne Funktion schreiben, oder in deiner Programmiersprache entsprechende Abfragen einbauen, oder nen Trigger einbauen...

aber wie gesagt, solange die Tabelle "main" überflüssig ist würde ich sowieso nichts machen ;-)
 
AW: Kniffliges SQL-statement...

Hi,

Also in den Tabellen werden schon noch ein paar mehr Spalten drin sein.

Lösen lässt sich das dann aber mit einer Stored Procedure.
Ist richtig quick and dirty.
Muss aber auch mal sein in diesen Zeiten der überbewerteten politischen Korrektheit. ;-)

Einfach mal in einer Spieldatenbank ausführen:
/* 2 Tabellen erstellen, die hoffentlich den Vorgaben entsprechen ;-)*/
SETANSI_NULLSON
GO
SETQUOTED_IDENTIFIERON
GO
CREATETABLE [dbo].[tbl_titel](
[ID] [int] IDENTITY(1,1)NOTNULL,
[titel] [nvarchar](100)NOTNULL,
CONSTRAINT [PK_tbl_titel] PRIMARYKEYCLUSTERED
(
[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]
CREATETABLE [dbo].[tbl_main](
[ID] [int] IDENTITY(1,1)NOTNULL,
[ID_titel] [int] NOTNULL,
CONSTRAINT [PK_tbl_main] PRIMARYKEYCLUSTERED
(
[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
ALTERTABLE [dbo].[tbl_main] WITHCHECKADDCONSTRAINT [FK_tbl_main_tbl_titel] FOREIGNKEY([ID_titel])
REFERENCES [dbo].[tbl_titel] ([ID])
GO
ALTERTABLE [dbo].[tbl_main] CHECKCONSTRAINT [FK_tbl_main_tbl_titel]
GO

/* Eine Stored Procedure erstellen*/
SETANSI_NULLSON
GO
SETQUOTED_IDENTIFIERON
GO
-- =============================================
-- Author: JR
-- Create date: 06.05.09
-- Description: DB Forum
-- =============================================
CREATEPROCEDURE [dbo].[Titelupdate]
-- Add the parameters for the stored procedure here
@titel varchar(100)=''
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SETNOCOUNTON;
-- Insert statements for procedure here
if @titel in(select titel from tbl_titel)
begin
insertinto tbl_main (id_titel)
select id from tbl_titel where titel like @titel
end
else
begin
insertinto tbl_titel (titel)values(@titel)
insertinto tbl_main (id_titel)select id from tbl_titel where titel = @titel
end
END
GO
/* Die Stored Procedure 2 mal aufrufen, beim ersten mal wird der Titel angelegt,*/
/* beim 2. Mal nur die ID in tbl_main eingetragen */
DECLARE @return_value int
EXEC
@return_value = [dbo].[Titelupdate]
@titel
= N'Titel18'
SELECT'Return Value'= @return_value
GO
DECLARE @return_value int
EXEC
@return_value = [dbo].[Titelupdate]
@titel
= N'Titel18'
SELECT'Return Value'= @return_value
GO

 
Werbung:
AW: Kniffliges SQL-statement...

Hallo bieber, hallo Ritschi ja, in der Originaldatenbank sind bei weitem mehr Tabellen und in diesen weitere Spalten enthalten ;-) tabelle_main und tabelle_titel sind spieltabellen, die den Kern meiner Frage abbilden sollten. Bis zu Deiner Antwort, Ritschi, hatte ich es letztendlich mit zwei Statements "gelöst" - obwohl ich alles mit einem Aufruf über die Bühne bringen wollte -> Ausgang ist eine VB.NET App. 1. Statement nach dem Muster: IF NOT EXISTS (SELECT FROM ...) INSERT INTO -> wenn titel='bla' nicht existiert, erstelle Eintrag (id wird erzeugt) 2. Statement nach dem Muster: INSERT INTO SELECT FROM -> id des titel wird in tabelle_main geschrieben Doch Deinen Beitrag, Ritschi, finde ich genial und danke Dir sehr herzlich!! Freudestrahlend würde ich diesen Thread als *solved and closed* betrachten ;-)
 
Zurück
Oben