Выбор отдельного пользователя из столбца с помощью innerjoin MSSQL 2005 и VBscript - PullRequest
2 голосов
/ 15 июня 2011

Использование Microsoft SQL 2005 и VBscript.

Я делаю раздел сообщений для веб-сайта.У меня есть таблица с именем mail.Столбцы являются messageid, отправителем, получателем, телом и созданы.Messageid, отправитель и получатель являются типами данных BIGINT.Столбец body имеет тип данных nvarchar (max).Созданный тип данных datetime.

В этом примере предположим, что пользователь John имеет идентификатор пользователя 100.

Я пытаюсь выделить отдельных пользователей, отправивших сообщения John ИЛИПолученное сообщение от John AND упорядочить пользователей по времени из созданного столбца (или по messageid).Мой запрос, который я пытался выполнить, либо дает сбой, либо дает мне одного и того же пользователя более одного раза.

Этот запрос:

SQL = "SELECT DISTINCT otherperson FROM ("
SQL = SQL & "SELECT DISTINCT sender AS otherperson, messageid from message where message.receiver= '100' ORDER BY messageid DESC "
SQL = SQL & "UNION "
SQL = SQL & "SELECT DISTINCT receiver AS otherperson, messageid from message where message.sender= '100' ORDER BY messageid DESC ) results "
SQL = SQL & "ORDER BY messageid"

Выдает ошибку: предложение ORDER BY недопустимо в представлениях, встроенных функциях, производные таблицы, подзапросы и общие табличные выражения, если также не указан TOP или FOR XML.

SQL = "SELECT DISTINCT otherperson, messageid FROM ("
SQL = SQL & "SELECT DISTINCT sender AS otherperson, messageid from message where message.receiver= '100' ORDER BY messageid DESC "
SQL = SQL & "UNION "
SQL = SQL & "SELECT DISTINCT receiver AS otherperson, messageid from message where message.sender= '100' ORDER BY messageid DESC ) results "
SQL = SQL & "ORDER BY messageid"

ТАКЖЕ выдает ошибку: предложение ORDER BY недопустимо в представлениях, встроенных функциях, производных таблицах, подзапросахи общие табличные выражения, если только не указан TOP или FOR XML.

SQL = "SELECT otherperson FROM ("
SQL = SQL & "SELECT DISTINCT sender AS otherperson from message where message.receiver= '100' "
SQL = SQL & "UNION "
SQL = SQL & "SELECT DISTINCT receiver AS otherperson from message where message.sender= '100' ) results "

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

Вы можете использовать messageid (это уникальное число, увеличенное на 1) или созданным (это столбец с типом данных datetime)

Можеткто-нибудь помочь с этим?

TIA

Ответы [ 2 ]

1 голос
/ 15 июня 2011

Я думаю, первое, что вам нужно исправить, это то, что нет поля messageid для упорядочения.У вас есть только одно поле из таблицы, созданное с помощью двух операторов SELECT.

Кроме того, у вас есть две круглые скобки, которые не нужны.Оба выглядят так:

WHERE (message.

Это отбрасывает ваш запрос.

Наконец, и реальная проблема здесь, у вас есть операторы ORDER BY внутри вашего подзапроса (ORDER BY messageid DESC), что вы не можете сделать.Удалите эти операторы, и вы исправите эту ошибку компилятора.

Удалите эти два оператора по порядку, измените свой порядок на или добавьте этот столбец и исправьте скобки, и вам будет хорошо.

Ваше окончательное утверждение должно выглядеть так:

SQL = "SELECT DISTINCT otherperson, messageid FROM ("
SQL = SQL & "SELECT DISTINCT sender AS otherperson, messageid from message where message.receiver= '100'  "
SQL = SQL & "UNION "
SQL = SQL & "SELECT DISTINCT receiver AS otherperson, messageid from message where message.sender= '100' ) results "
SQL = SQL & "ORDER BY messageid"
0 голосов
/ 15 июня 2011

Есть две избыточные скобки.
Вот как выглядит ваш запрос:

SELECT DISTINCT otherperson 
FROM 
(
    SELECT DISTINCT sender AS otherperson from message where (message.receiver= '100'
    UNION
    SELECT DISTINCT receiver AS otherperson from message where (message.sender= '100'
) results
ORDER BY messageid

Просто удалите ( перед message.receiver и message.sender.

[РЕДАКТИРОВАТЬ] Удалить самый верх DISTINCT.Это избыточно.UNION не будет возвращать повторяющиеся значения, нет необходимости делать дополнительные различия.

Если вам действительно нужно DISTINCT, вы можете заменить ORDER BY messageid на ORDER BY 1 - порядок по первому столбцу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...