2 Stimmen

Wie würde ich das mit SQL Server machen?

Ich habe zwei Tabellen Benutzer und Adresse

Schema der Tabelle users

 user_id
 name
 address_id
 sent

Schema der Adresstabelle

 address_id
 create_date
 location
 user_id

Ich habe diese Abfrage, die 16 Zeilen zurückgibt

select * from users where sent = 1;

aber alle address_id sind NULL, weil sie noch nicht erstellt worden sind

Ich muss also 16 Zeilen in der Adresstabelle erstellen, eine für jeden der Benutzer mit der user_id des Benutzers, und dann die address_id in der Benutzertabelle dieser Adresse festlegen

Im Moment kann ich das Ortsfeld leer lassen. Alles, was ich tun muss, ist, das create_date auf CURRENT_DATE

Gibt es eine Möglichkeit, dies in einer einzigen Abfrage zu tun?

2voto

Trio Punkte 176

Ich bin mir nicht ganz sicher, was Sie meinen, aber dies sollte Sie zumindest in die richtige Richtung führen

Begin Try
    Begin Transaction

        Update Users
        Set Users.address = Address.address, create_date = GetDate()
        From Addresses
            Inner Join Users On Addresses.userid = Users.userid

    Commit Transaction
End Try
Begin Catch
    Rollback Transaction
End Catch

Sie sollte in etwa so lauten. Es gibt mehrere Möglichkeiten, das Problem zu lösen, also viel Spaß damit und hoffentlich hat das geholfen. Um es zu testen, schreibe zwei Select * From Users Aussagen, eine vorher und eine nachher. Auch ändern Commit Transaction a Rollback Transaction Sie müssen also nicht befürchten, einen Fehler zu machen.

Lies die Frage noch einmal, ja, das geht nicht auf einen Schlag, man muss nur die Update Anweisung mit

Insert Into Addresses (address_id, create_date, location, user_id)
Values ('@ddr355_1d', GetDate(), '1234theLocation', 123478)

und Sie müssen das für jeden einzelnen tun, aber das sollte bei nur 16 Einträgen in der Benutzertabelle einfach sein. Wenn Sie vorhaben, der Tabelle weitere Einträge hinzuzufügen, sollten Sie sich überlegen, eine Stored Procedure zu schreiben. Etwas wie dieses

Create Procedure [dbo].[AddressesInsertData]
(
    @Address Int,
    @Location varchar(100),
    @UserId Int
)
As
Begin Try
    Begin Transaction

        Insert Into Addresses (address_id, create_date, location, user_id)
        Values (@Address, GetDate(), @Location, @UserId)

    Commit Transaction
End Try
Begin Catch
    Rollback Transaction
End Catch

Grundstruktur einer gespeicherten Prozedur. Ich würde eine if not exists die aktualisieren statt einfügen würde, aber das sollte für den Anfang reichen. Ich hoffe, dass diese Beispiele einige Dinge für Sie klären und Ihnen helfen.

2voto

t-clausen.dk Punkte 42186

Versuchen Sie dies:

declare @user table(user_id [int] IDENTITY(1,1), name varchar(25), address_id int, sent int)
declare @address table(address_id [int] IDENTITY(1,1) NOT NULL, create_date datetime default getdate(), location varchar(100), user_id int)
declare @t table(user_id int, address_id int)

insert @user (name) values('you')
insert @user (name) values('someone else')

begin Transaction 

insert @address (user_id) 
output inserted.user_id, inserted.address_id
into @t
select user_id from @user u 
where not exists (select 1 from @address where u.user_id = user_id)

update u 
set u.address_id = t.address_id
from @user u
join @t t
on u.user_id = t.user_id

commit transaction 

select * from @user
select * from @address

0voto

onedaywhen Punkte 52850

Es gibt eine Faustregel, dass eine Tabelle ENTWEDER eine Entität/Klasse ODER die Beziehung zwischen Entitäten/Klassen modelliert, aber nicht beides.

Daher schlage ich vor, dass Sie die address_id Spalte aus der Tabelle users, entfernen Sie user_id aus der Adresstabelle und erstellen eine dritte Tabelle, die beide user_id et address_id um die Beziehung zwischen Benutzern und ihren Adressen zu modellieren. Auf diese Weise sind Sie auch nicht mehr auf nullbare Spalten angewiesen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X