Как получить более одной записи, используя регистр в PostgreSQL? - PullRequest
1 голос
/ 04 января 2012

У меня есть две таблицы:

 1) fk_tblUserEmployeeList
 2) fk_tblmanageremployeelist

В этих двух таблицах обычно используется один столбец: userid, и я получаю userid из пользовательского интерфейса.Я хочу запись для userid из первой таблицы.Если его нет, получите запись для того же userid из второй таблицы ..

Я пытаюсь использовать CASE, но получаю ошибку:

ERROR:  more than one row returned by a subquery used as an expression

Ниже мой запрос:

select case when ( select count(userid) 
                   from fk_tblUserEmployeeList 
                   where userid=1
                 ) > 1 
            then ( select employeeid 
                   from fk_tblUserEmployeeList 
                   where userid=1
                 )
            else ( select employeeid 
                   from fk_tblmanageremployeelist 
                   where userid=1
                 ) 
       end

Ответы [ 4 ]

1 голос
/ 04 января 2012

Попробуйте:

select employeeid 
from fk_tblUserEmployeeList 
where userid=1
union all
select employeeid 
from fk_tblmanageremployeelist
where userid=1 and
not exists (select null
            from fk_tblUserEmployeeList 
            where userid=1)

Обратите внимание, что предложение not exists не требуется, если в обеих таблицах нет ни одного пользователя.

1 голос
/ 04 января 2012

С кодом, который вы представили, результат из case будет иметь более одного row.Это даст ошибку из-за select, ранее case.Вы не можете select несколько rows там.

select

case when (select count(userid) from fk_tblUserEmployeeList where userid=1) > 1
    then (select employeeid from fk_tblUserEmployeeList where userid=1)
    else (select employeeid from fk_tblmanageremployeelist where userid=1)
end

Итак, чтобы избежать этого, вы можете использовать IF .

Это должно быть что-токак это:

IF (select count(userid) from fk_tblUserEmployeeList where userid=1) > 1 THEN
    (select employeeid from fk_tblUserEmployeeList where userid=1)
ELSE
    (select employeeid from fk_tblmanageremployeelist where userid=1)
END IF;
0 голосов
/ 04 января 2012

Я думаю, это будет самым простым и быстрым:

SELECT COALESCE(
        (SELECT employeeid FROM fk_tblUserEmployeeList    WHERE userid = 1),
        (SELECT employeeid FROM fk_tblmanageremployeelist WHERE userid = 1))

Если userid не УНИКАЛЬНЫЙ , вам нужно будет добавить метод для выбора одной строки, например:

SELECT COALESCE(
        (SELECT employeeid
         FROM   fk_tblUserEmployeeList
         WHERE  userid = 1
         ORDER  BY employeeid
         LIMIT  1),
        (SELECT employeeid
         FROM   fk_tblmanageremployeelist
         WHERE  userid = 1
         ORDER  BY employeeid
         LIMIT  1)
        )
0 голосов
/ 04 января 2012
    select employeeid 
    from fk_tblUserEmployeeList 
    where userid = 1
      and ( select count(*) 
            from fk_tblUserEmployeeList 
            where userid=1
          ) > 1
  union all
    select employeeid 
    from fk_tblmanageremployeelist 
    where userid = 1
      and ( select count(*) 
            from fk_tblUserEmployeeList 
            where userid = 1
          ) <= 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...