cascading Input Control sql query return error: ORA-01427: подзаявка с един ред връща повече от един ред

търся решение за моята грешка в sql заявката. Опитвам се да създам втори каскаден контрол на въвеждане в JaspersoftServer. Първият входен контрол работи добре, но когато се опитам да създам втори каскаден IC, той се връща с грешката. Имам 3 таблици (user, client, user_client), много към много, така че 1 свързана таблица (user_client) между тях. Първият входен контрол (клиент) - работи добре, крайният потребител ще избере клиента, клиентът може да има много потребители , така че каскадата е ключът. Освен това, като изход, бих искал да получа не user_id, а собственото и фамилното име на потребителя като едно поле на колона. И тук съм заседнал. Почти съм сигурен, че това е проста синтактична грешка, но прекарах няколко часа, за да разбера какво не е наред с нея. Моля, някой може ли да го погледне и да посочи къде е проблемът в запитването ми?! Досега направих:

select distinct 
u.user_id,(
SELECT CONCAT(first_name, surname) AS user_name from tbl_user ),
c.client_id
FROM tbl_user u
left join tbl_user_client uc
on uc.user_id = u.user_id
left join tbl_client c
on c.client_id = uc.client_id
where c.client_id = uc.client_id
order by c.client_id

Благодаря ви предварително. P.S. JasperServer + Oracle 11g


person USSR    schedule 25.02.2015    source източник


Отговори (1)


Правите некорелирана подзаявка, за да получите първото/фамилното име от потребителската таблица. Няма връзка между тази подзаявка:

SELECT CONCAT(first_name, surname) AS user_name from tbl_user

... и потребителския идентификатор в основната заявка, така че подзаявката ще се опита да върне всяко име/фамилия за всички потребители, за всеки ред, който вашите обединения открият.

Изобщо не е необходимо да правите подзаявка, тъй като вече имате налична tbl_user информация:

select u.user_id,
  CONCAT(u.first_name, u.surname) AS user_name
  c.client_id
FROM tbl_user u
left join tbl_user_client uc
on uc.user_id = u.user_id
left join tbl_client c
on c.client_id = uc.client_id
where c.client_id = uc.client_id
order by c.client_id

Ако искате да поставите интервал между собственото и фамилното име, ще имате нужда или от вложени concat() извиквания, тъй като тази функция приема само два аргумента:

select u.user_id,
  CONCAT(u.first_name, CONCAT(' ', u.surname)) AS user_name
...

... или може би по-четливо използвайте оператора за конкатенация вместо:

select u.user_id,
  u.first_name ||' '|| u.surname AS user_name
...

Ако първата контрола е избрала клиент и тази заявка трябва да намери потребителите, свързани с този клиент, вие се присъединявате към таблиците по грешен начин, нали? И вие не филтрирате избрания клиент - но нямате представа как това всъщност се прилага в Jasper. Може би искате целия списък и ще го филтрирате от страната на Jasper.

person Alex Poole    schedule 25.02.2015
comment
Благодаря много, това помага! Имам обаче допълнителен въпрос - когато се опитвам да свържа име и фамилия с ИНТЕРВАЛ, като например: CONCAT(u.first_name, ' ', u.surname) AS user_name - имам грешка, грешен брой аргументи, някаква идея как мога да добавя това празно пространство, за да направя този файл четим?! Благодаря ти - person USSR; 25.02.2015
comment
@user3891065 - това наистина трябва да е отделен въпрос, но съм сигурен, че е задаван много пъти, така че добавих две опции към отговора. - person Alex Poole; 25.02.2015
comment
Благодаря много Алекс Пул, вашите отговори ми спестяват време! И да, прав си, изглежда, че всичко е с главата надолу, ще се опитам да разбера ... но ако имате идея кой е най-добрият подход, моля, уведомете ме. Първата (клиентска) заявка е проста като: изберете client_id от tbl_client - person USSR; 25.02.2015
comment
@user3891065 - ако търсите потребители за конкретен клиент, просто бихте select ... from tbl_usr_client uc join tbl_user u on ... where uc.client_id = x, нали? Няма нужда да натискате отново tbl_client или да използвате външни съединения, доколкото виждам. - person Alex Poole; 25.02.2015