2013-02-23 3 views
0

Я как бы начинаю с SQL.Новичок SQL-запрос с ROW_NUMBER

Прямо сейчас я пытаюсь создать несколько сложный выбор, но я получаю некоторую ошибку, и я знаю, что это ошибка начинающего.

Любая помощь приветствуется.

SELECT ROW_NUMBER() OVER (ORDER BY score) AS rank, userID, facebookID, name, score FROM (
    SELECT * FROM Friends AS FR WHERE userID = ? 
    JOIN 
    Users WHERE Users.facebookID = FR.facebookFriendID 
) 
UNION (
    SELECT * FROM User WHERE userID = ? 
) 

Где 2? будет заменен идентификатором моего пользователя.

Таблица Пользователь содержит каждого пользователя в моей базе данных, в то время как таблица друзей содержит все facebookFriends для пользователя.

USER TABLE 
userID | facebookID | name | score 

FRIENDS TABLE 
userID | facebookFriendID 

Выборочные данные

ПОЛЬЗОВАТЕЛИ

A | facebookID1 | Alex | 100 
B | facebookID2 | Mike | 200 

ДРУЗЕЙ

A | facebookID2 
A | facebookID3 
B | facebookID1 

я хотел бы этот результат, поскольку Алекс и микрофон друзья:

rank | userID | facebookID | name 
1 | B  | facebookID2 | Mike 
2 | A  | facebookID1 | Alex 

Надеюсь, это было вполне понятное объяснение.

Я получаю эту ошибку в данный момент:

произошла ошибка выполняющийся запрос: Неправильный синтаксис около ключевого слова «AS».

+1

Какая БД вы используете (и добавляете ключевое слово)? MS-SQL Server? Поскольку OVER не поддерживается всеми БД. – Roger

+0

Прошу прощения, это SQL Server. Это часть запроса в моей архитектуре на стороне сервера azure. – Axy

ответ

1

У вас есть несколько вопросов по вашему запросу. JOINS Приходят до WHERE статей. А при использовании JOIN вам необходимо указать свои статьи ON. Также при использовании UNION вы должны убедиться, что одинаковое количество полей возвращается в обоих запросах.

Дайте этому попытку:

SELECT ROW_NUMBER() OVER (ORDER BY score) AS rank, userID, facebookID, name, score 
FROM ( 
    SELECT * 
    FROM Users 
    WHERE UserId = 'A' 
    UNION 
    SELECT U.userId, u.facebookId, u.name, u.score 
    FROM Friends FR 
     JOIN Users U ON U.facebookID = FR.facebookFriendID 
    WHERE FR.userID = 'A') t 

SQL Fiddle Demo

Кроме того, по пути вы используете ROW_NUMBER, это действительно будет номер строки против в RANK. Если вы хотите Рейтинги (с потенциальными связями), замените ROW_NUMBER на RANK.

+0

Большое спасибо. Это помогло мне. – Axy

+0

@Axyaxy - np, рад, что я мог бы помочь! – sgeddes

Смежные вопросы