2010-11-12 80 views
1

好吧,所以我有一个在我的数据库中的笔记和我的数据库中的用户表。比方说,笔记表看起来像这样:使用没有主键的主键选择语句

NoteId NoteTitle NoteAuth 
-------------------------------- 
1  TempTitle 254 
2  TempTitle2 871 

和用户表如下所示:

UserId UserName 
------------------- 
254  Bob 
871  Jim 

我怎样才能从注表中选择,但选择NoteAuth从用户表中的用户名。基本上,如何在没有在表上设置主键的情况下使用主键。

+0

一个值得注意的SQL大师说:*如果它没有主键,这不是一个表* – 2010-11-12 19:52:20

回答

3

你可以尝试这样的事情

SELECT Notes.NoteId, Notes.NoteTitle, Notes.NoteAuth 
FROM Notes 
INNER JOIN Users ON Notes.NoteAuth = Users.UserId 
WHERE Users.UserName = 'Bob' 

编辑

下面是用于指定注释的作者返回用户名的版本。

SELECT Users.UserName, Notes.NoteId, Notes.NoteTitle, Notes.NoteAuth 
FROM Notes 
INNER JOIN Users ON Notes.NoteAuth = Users.UserId 
WHERE Notes.NoteAuth = 254 
+0

是的,但我想给记的ID来选择,然后选择字鲍勃,甚至。尽管我的选择实际上会给我254. – 2010-11-12 18:59:53

+0

Join和Inner Join有什么区别?您使用Join,而另一个答案使用内部连接。为什么这个决定? – 2010-11-12 19:08:52

+0

INNER JOIN和JOIN在这种情况下是等价的。但是,您没有指出您正在使用哪个DBMS,所以我应该包含INNER关键字以避免混淆。 – bobs 2010-11-12 19:11:43

4
SELECT NoteID, NoteTitle, UserName 
    FROM Notes INNER JOIN Users ON Notes.NoteAuth = Users.UserID 

有对存在任何按键的加入以使用一列没有要求。

2
select n.NoteId, n.NoteTitle, n.NoteAuth, u.UserName 
from Notes n 
inner join User u on n.NoteAuth = u.UserID 
+0

再次检查。 。 。 – 2010-11-12 18:57:34

2

缺少主键会导致缺乏表完整性。现在,您将无法在表格之间创建外键。这意味着你将被允许创建一个用户在Users表中不存在的笔记。

这不会

SELECT n.NoteTitle, u.UserName 
FROM NoteTable n LEFT JOIN Users u ON n.NoteAuth = u.UserId 

这将在SqlServer的工作阻止你。

问题是,如果你有一个NoteAuth不存在于用户表中的笔记,那么你最终会得到一个NULL用户名。使用ISNULL将NULL替换为“没有用户名”。

但就像我说过的,表格之间没有任何完整性。

0
SELECT U.Username, N.NoteTitle from Notes N, Users U WHERE N.NoteAuth = U.UserId