我没有看到任何循环。所有外键都指向User。
CREATE TABLE [User] (
[user_id] INT NOT NULL PRIMARY KEY,,
[user_name] VARCHAR(50),
[first_name] VARCHAR(50),
[last_name] VARCHAR(50)
);
CREATE TABLE [Order] (
[order_id] INT NOT NULL PRIMARY KEY,
[user_id] INT REFERENCES [User] ( [user_id] )
[order_name] VARCHAR(50)
);
CREATE TABLE [Auction] (
[auction_id] INT NOT NULL PRIMARY KEY,
[order_id] INT REFERENCES [Order] ( [order_id] )
--,...
);
CREATE TABLE [AuctionOffer] (
[offer_auction_id] INT NOT NULL PRIMARY KEY,
[auction_id] INT REFERENCES [Auction] ( [auction_id] ),
[user_id] INT REFERENCES [User] ( [user_id] )
--,...
);
CREATE TABLE [Tender] (
[tender_id] INT NOT NULL PRIMARY KEY,
[order_id] INT REFERENCES [Order] ( [order_id] )
--,...
);
CREATE TABLE [TenderOffer] (
[tender_offer_id] INT NOT NULL PRIMARY KEY,
[tender_id] INT REFERENCES [Tender] ( [tender_id] ),
[user_id] INT REFERENCES [User] ( [user_id] )
---,...
);
必须先创建Users,然后再创建Orders。之后,Tenders 和 TenderOffers 或 Auctions 和 AuctionOffers。
在查询中加入表:
SELECT
a.[auction_id],
o.[order_id], o.[order_name], ou.[user_name] as [creator]
FROM [Auction] a
INNER JOIN [Order] o ON o.[order_id] = a.[order_id]
INNER JOIN [User] ou ON ou.[user_id] = o.[user_id]
;
SELECT
aou.[user_name] as [bidder], ao.[created_date], ao.[auction_amount_offer]
FROM [AuctionOffer] ao
INNER JOIN [User] aou ON aou.[user_id] = ao.[user_id]
WHERE ao.[auction_id] = ?
ORDER BY ao.[Date] DESC
;
或组合:
SELECT
a.[auction_id],
o.[order_id], o.[order_name], ou.[user_name] AS [creator],
aou.[user_name] AS [bidder], ao.[created_date], ao.[auction_amount_offer]
FROM [Auction] a
INNER JOIN [Order] o ON o.[order_id] = a.[order_id]
INNER JOIN [User] ou ON ou.[user_id] = o.[user_id]
LEFT JOIN [AuctionOffer] ao ON ao.[auction_id] = a.[auction_id] AND ao.[deleted_at] IS NULL
LEFT JOIN [User] aou ON aou.[user_id] = ao.[user_id]
ORDER BY a.[start_date], a.[start_time] a.[auction_id], ao.[created_at]
请注意,[User] 有两个实例,但别名不同。还有两列用于[User].[user_name],但用于不同的表别名。