MS-Office-Forum

Zurück   MS-Office-Forum > Microsoft Access & Datenbanken > SQL
Registrieren Forum Hilfe Alle Foren als gelesen markieren

Banner und Co.

Antworten
Ads
Themen-Optionen Ansicht
Alt 09.05.2019, 20:53   #1
Markus Chemnitz
MOF Koryphäe
MOF Koryphäe
Standard T-SQL : MSSQL 2008 - Unique zwischen Bit Feldern

Hallo,

SQL Server 2008 R2. Ich habe eine Tabelle:
Code:

CREATE TABLE [dbo].[tbl_antworten](
	[id_antworten] [int] IDENTITY(1,1) NOT NULL,
	[nr_id_person] [int] NOT NULL,
	[nr_id_frage] [int] NOT NULL,
	[kreuz_1] [bit] NOT NULL,
	[kreuz_2] [bit] NOT NULL,
	[kreuz_3] [bit] NOT NULL,
	[kreuz_4] [bit] NOT NULL,
	[kreuz_5] [bit] NOT NULL,
	[kreuz_6] [bit] NOT NULL,
	[bewertung] [int] NULL,
 CONSTRAINT [PK_tbl_antworten] PRIMARY KEY CLUSTERED 
(
	[id_antworten] 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

ALTER TABLE [dbo].[tbl_antworten] ADD  CONSTRAINT [DF_tbl_antworten_kreuz_1]  DEFAULT ((0)) FOR [kreuz_1]
GO

ALTER TABLE [dbo].[tbl_antworten] ADD  CONSTRAINT [DF_tbl_antworten_kreuz_2]  DEFAULT ((0)) FOR [kreuz_2]
GO

ALTER TABLE [dbo].[tbl_antworten] ADD  CONSTRAINT [DF_tbl_antworten_kreuz_3]  DEFAULT ((0)) FOR [kreuz_3]
GO

ALTER TABLE [dbo].[tbl_antworten] ADD  CONSTRAINT [DF_tbl_antworten_kreuz_4]  DEFAULT ((0)) FOR [kreuz_4]
GO

ALTER TABLE [dbo].[tbl_antworten] ADD  CONSTRAINT [DF_tbl_antworten_kreuz_5]  DEFAULT ((0)) FOR [kreuz_5]
GO

ALTER TABLE [dbo].[tbl_antworten] ADD  CONSTRAINT [DF_tbl_antworten_kreuz_6]  DEFAULT ((0)) FOR [kreuz_6]
GO
Wie bekomme ich es hin, dass ich für
[kreuz_1] [bit] NOT NULL,
[kreuz_2] [bit] NOT NULL,
[kreuz_3] [bit] NOT NULL,
[kreuz_4] [bit] NOT NULL,
[kreuz_5] [bit] NOT NULL,
[kreuz_6] [bit] NOT NULL
jeweils nur ein True pro Datensatz setzen kann?

Danke für Eure Hilfe!

__________________

MarkB

Vom Leben nichts zu erwarten, ist das Geheimnis aller echten Heiterkeit!
Markus Chemnitz ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 09.05.2019, 21:24   #2
hcscherzer
MOF Guru
MOF Guru
Standard

Ich stelle mal das Datenmodell in Frage.
Eigentlich gehören diese Kreuz-Felder in eine zusätzliche Tabelle.
Oder man fasst sie zusammen zu einem Feld, welches den Wert 1 bis 6 annehmen kann.

__________________

Freundlichen Gruß
Hans-Christian
-----------------------------------------
Oft erwünscht, selten beachtet: nach Erledigung des Problems den Thread als erledigt zu markieren
-----------------------------------------
Ich möchte nur Mitglied in einem Verein sein, der Leute wie mich nicht als Mitglied aufnimmt (Groucho Marx).
-----------------------------------------
Ab sofort regelmässig: MOF Stammtisch in Bremen. Näheres hier.
hcscherzer ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 10.05.2019, 15:34   #3
Markus Chemnitz
Threadstarter Threadstarter
MOF Koryphäe
MOF Koryphäe
Standard

Hallo Hans Christian,
in der zusätzlichen Tabelle hätte ich ja das gleiche Problem. Deine zweite Idee 'Oder man fasst sie zusammen zu einem Feld, welches den Wert 1 bis 6 annehmen kann.' gefällt mir da schon besser. Es ist für meinen künftigen Schwiegersohn, er muss da irgendwelche statistischen Auswertungen mittels Fragebogen machen. Er hat mir das Datenmodell sozusagen vorgegeben im Excel. Mal schauen ob ich da noch was ändern kann.
Danke trotzdem! Von Dir kommt IMMER was brauchbares ... :-)

In dem Sinne... :-)

__________________

MarkB

Vom Leben nichts zu erwarten, ist das Geheimnis aller echten Heiterkeit!
Markus Chemnitz ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 10.05.2019, 20:48   #4
hcscherzer
MOF Guru
MOF Guru
Standard

Zitat:

in der zusätzlichen Tabelle hätte ich ja das gleiche Problem

Nee, hättest Du nicht.
Denn dort hättest Du nicht einen Satz mit sechs Feldern sondern einen über Fremdschlüssel verknüpften Satz mit genau einem Feld. Bei mehreren erlaubten Möglichkeiten wären denn da entsprechend viele Sätze.
Klassische 1:n Struktur.
Und wenn nur ein Kreuz pro Mastersatz erlaubt ist, lässt sich das ganz einfach lösen über einen Unique-Index auf den Fremdschlüssel in der Detailtabelle. Käme allerdings dem einen nummerischen Feld in der Mastertabelle mit Werten 1 bis 6 verdächtig nahe.

Und danke für die anerkennenden Worte.

__________________

Freundlichen Gruß
Hans-Christian
-----------------------------------------
Oft erwünscht, selten beachtet: nach Erledigung des Problems den Thread als erledigt zu markieren
-----------------------------------------
Ich möchte nur Mitglied in einem Verein sein, der Leute wie mich nicht als Mitglied aufnimmt (Groucho Marx).
-----------------------------------------
Ab sofort regelmässig: MOF Stammtisch in Bremen. Näheres hier.
hcscherzer ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 15.05.2019, 07:17   #5
sonic8
MOF Koryphäe
MOF Koryphäe
Standard

Um isoliert von tieferen Überlegungen die Frage zu beantworten:
Code:

CREATE TABLE [dbo].[tbl_antworten](
	[id_antworten] [int] IDENTITY(1,1) NOT NULL,
	[nr_id_person] [int] NOT NULL,
	[nr_id_frage] [int] NOT NULL,
	[kreuz_1] [bit] NOT NULL,
	[kreuz_2] [bit] NOT NULL,
	[kreuz_3] [bit] NOT NULL,
	[kreuz_4] [bit] NOT NULL,
	[kreuz_5] [bit] NOT NULL,
	[kreuz_6] [bit] NOT NULL,
	[bewertung] [int] NULL,

	SummeKreuze AS (convert(int,[kreuz_1]) 
					+ convert(int,[kreuz_2]) 
					+ convert(int,[kreuz_3]) 
					+ convert(int,[kreuz_4]) 
					+ convert(int,[kreuz_5]) 
					+ convert(int,[kreuz_6])
					 ) PERSISTED,

 CONSTRAINT [PK_tbl_antworten] PRIMARY KEY CLUSTERED 
(
	[id_antworten] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]


ALTER TABLE [dbo].[tbl_antworten] ADD  
	CONSTRAINT chkJederNurEinKreuz CHECK (SummeKreuze <=1);
GO

INSERT INTO [dbo].[tbl_antworten]([nr_id_person],[nr_id_frage],[kreuz_1],[kreuz_2],[kreuz_3],[kreuz_4] ,[kreuz_5] ,[kreuz_6] )
	VALUES (1,2,1,0,0,0,0,0);

INSERT INTO [dbo].[tbl_antworten]([nr_id_person],[nr_id_frage],[kreuz_1],[kreuz_2],[kreuz_3],[kreuz_4] ,[kreuz_5] ,[kreuz_6] )
	VALUES (1,3,1,0,0,0,1,0);

-- DROP TABLE [dbo].[tbl_antworten];
So, und jetzt bitte die ganzen Kreuze durch ein numerisches Feld ersetzen! ;-)

__________________

Office / Access 2019: Rückkehr der Symbolleiste?
sonic8 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Ads
Antworten


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Besucher: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge anzufügen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

vB Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist An.
Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:54 Uhr.



Powered by: vBulletin Version 3.6.2 (Deutsch)
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.

Copyright ©2000-2018 MS-Office-Forum. Alle Rechte vorbehalten.
Copyright ©Design: Manuela Kulpa ©Rechte: Günter Kramer
Eine Verwendung der Inhalte in anderen Publikationen, auch auszugsweise,
ist ohne ausdrückliche Zustimmung der Autoren nicht gestattet.