2010-11-12 17 views
1

Итак, у меня есть таблица заметок в моей базе данных и таблица для пользователей из моей базы данных. Допустим, таблица нот выглядит следующим образом:Оператор выбора с использованием первичного ключа без первичного ключа

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

Пользователи и таблица выглядит следующим образом:

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

Как я могу выбрать из таблицы Примечание, но выбрать NoteAuth как UserName из таблицы Users. В принципе, как я могу использовать первичный ключ без первичного ключа, настроенного в таблице.

+0

Заметный SQL гуру сказал: * Если это не имеет первичный ключа, это не таблица * –

ответ

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

Да, но я хочу, чтобы выбрать данную записку идентификатор, а затем выберите слово Боба, даже. хотя мой выбор действительно дал бы мне 254. –

+0

В чем разница в Join и Inner Join? Вы используете Join, в то время как другой ответ использует внутреннее соединение. Почему это решение? –

+0

INNER JOIN и JOIN эквивалентны в этом случае. Однако вы не указали, какую СУБД вы используете, поэтому я должен был включить ключевое слово INNER, чтобы избежать путаницы. – bobs

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

Там нет никаких требований для каких-либо клавиш существуют, чтобы использовать столбец в JOIN.

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

Еще раз проверьте. , , –

2

Отсутствие первичного ключа приведет к отсутствию целостности таблицы. Теперь вы не сможете создать внешний ключ между таблицами. Это означает, что в будущем вам будет разрешено создать заметку с пользователем, которого нет в таблице «Пользователи».

Это не остановит вас от

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 
Смежные вопросы