2015-02-25 2 views
0

ищет решение по моей ошибке запроса sql. Я пытаюсь создать второй каскадный входной контроль в JaspersoftServer. Первый входной контроль работает нормально, однако, когда я пытаюсь создать вторую каскадную ИС, она возвращается с ошибкой. У меня есть 3 таблицы (пользователь, клиент, user_client), многие для многих, поэтому одна связанная таблица (user_client) между ними. 1-й контроль ввода (клиент) - хорошо работает, конечный пользователь будет выбирать клиента, клиент может иметь много пользователей , поэтому каскад - это ключ. Кроме того, в качестве результата я хотел бы получить не user_id, а имя пользователя и имя последнего как одно поле столбца. И вот где я застрял. Я уверен, что это простая ошибка синтаксиса, но потратил пару часов на то, чтобы понять, что с ним не так. Кто-нибудь может посмотреть на него и указать, где проблема в моем запросе? До сих пор я сделал:Каскадирование Ошибка возврата sql-запроса ввода: «ORA-01427: однострочный подзапрос возвращает более одной строки»

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

ответ

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() вызовы, начиная с that function only takes two arguments:

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

... или, возможно, более читаемо использовать the concatenation operator вместо:

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

Если первый контроль выбрал клиент, и этот запрос должен найти пользователей, связанных с этим клиентом, вы присоединяетесь к таблицам навыворот, не так ли? И вы не фильтруете выбранный клиент, но не знаете, как это реализовано в Jasper. Возможно, вам нужен весь список, и он будет фильтровать его на стороне Джаспера.

+0

Большое спасибо, это помогает! Однако у меня есть дополнительный вопрос - когда я пытаюсь объединить имя и фамилию с помощью SPACE, например: CONCAT (u.first_name, '', u.surname) AS user_name - у меня есть ошибка, неправильное количество аргументов, любая идея, как я могу добавить это пустое пространство, чтобы сделать это доступным для чтения?! Спасибо – USSR

+0

@ user3891065 - это действительно должен быть отдельный вопрос, но я уверен, что его спрашивали много раз, поэтому я добавил два варианта ответа. –

+0

Большое спасибо Alex Poole, ваши ответы спасают меня! И да, вы правы, похоже, что все перевернуто, попробуем выяснить ... но если у вас есть идея, то какой лучший подход, пожалуйста, дайте мне знать. Первый (клиентский) запрос прост как: select client_id от tbl_client – USSR