Как сделать MS SQL создать представление с уникальными идентификаторами? - PullRequest
0 голосов
/ 28 декабря 2011

Справочная информация:

Сначала меня попросили создать веб-сайт с использованием mysql в качестве базы данных, после того, как это было сделано и отправлено, клиенты попросили меня преобразовать его в mssql и 3 уровня.

Я сделал классы и функции для передачи данных между серверами, так что 3-х уровневый бит почти на полпути. я сейчас борюсь с MsSQL.

Вопрос:

версия вопроса MySQL выглядит так:

select a.id as a_id, a.first_name, a.last_name, a.agent_code,
       b.id as b_id, b.user_id, b.status_admin 
from tbl_user a 
  inner join tbl_testimonia b 
    on a.id = b.user_id 
where b.status_admin=0  
group by a.id
order by b.id desc

он возвращает отзывы, которые еще не утверждены, сгруппированы для каждого пользователя;


Где я застрял:

Я не могу преобразовать это в MSSQL

Моя лучшая попытка:

  • Создать вид;

как в:

    create view test as
    (
    select a.id as a_id, a.first_name, a.last_name, a.agent_code,
    b.id as b_id, b.user_id,  b.status_admin 
    from tbl_user a inner join tbl_testimonia b on a.id = b.user_id 
    where b.status_admin=0 and a.id in  
    (
    select a.id from tbl_user a 
    inner join tbl_testimonia b 
    on a.id = b.user_id
    where b.status_admin=0 
    group by a.id
    )
    )

это выбирает то, что я хочу, но поле id представления создания не может быть сгруппировано , что означает, что поле id не уникально и может иметь то же значение.

Полагаю, до этого момента у меня возник вопрос: как мне однозначно выбрать поле id в представлении? Конечно, я могу сделать это на PHP, но я мог бы сделать это месяц назад, когда впервые столкнулся с проблемой.

Я уже некоторое время пытаюсь найти ответ, но, похоже, не могу найти ответ, уникальный для моего вопроса

  • edit: MSSQL не работает, потому что, хотя подзапрос выбирает уникальные идентификаторы, оператор in в основном запросе делает это бесполезным
  • edit: пример вывода :: ~ (в MySql 3-е поле опущено)

    | a_id  |  firstN | LastN |  agent_code  |   b_id  |  user_id |status_admin|
    +--------------------------------------------------------------------------+
    | 32    |  fn1    | ln1   |  AC123213    |   14    |   32     |   0        |
    | 41    |  fn2    | ln2   |  12345678    |   15    |   41     |   0        |
    | 32    |  fn1    | ln1   |  AC123213    |   16    |   32     |   0        |
    
  • edit: ВОПРОС РЕШЕН большое спасибо Ливену за простой ответ

Ответы [ 2 ]

1 голос
/ 29 декабря 2011

Как вы уже объяснили, в отличие от SQL Server, MySQL позволяет группировать с помощью неагрегированных выражений, подобных этому

SELECT  *
FROM    mytable
GROUP BY
        column

Поскольку неагрегированное выражение в GROUP BY возвращает произвольную запись из каждой группы и не предполагаетсядля использования в случае изменения значений вы должны использовать следующий оператор в качестве эквивалента в SQL Server

select a.id as a_id
       , MIN(a.first_name)
       , MIN(a.last_name)
       , MIN(a.agent_code)
       , MIN(b.id as b_id)
       , MIN(b.user_id)
       , MIN(b.status_admin)
from   tbl_user a 
       inner join tbl_testimonia b on a.id = b.user_id 
where  b.status_admin=0  
group by 
       a.id
order by 
       b.id desc
0 голосов
/ 28 декабря 2011

Если вы хотите иметь неповторяющиеся идентификаторы, вы можете

select DISTINCT a.id from tbl_user a 
inner join tbl_testimonia b 
  on a.id = b.user_id where b.status_admin=0 

в своем подзапросе

...