2014-01-27 5 views
1

Мне нужно получить только уникальные строки из трех таблиц. Как я могу это сделать?Как удалить повторяющиеся строки из соединения (SQL)

У меня есть SQL-запрос:

SELECT * 
FROM l_req 
LEFT JOIN p_req ON (p_req.uid = l_req.uid) 
LEFT JOIN r_req ON (r_req.uid = l_req.uid) 
WHERE l_req.uid = 100931362 

Таблицы архитектуры:

Table l_req 

id column2 column3 uid 

1  2  3  100931362 
2  3  4  100931362 
3  4  5  100931362 

Table p_req 

id column2 column3 uid 

1  6  5  100931362 

и т.д.

Результат запроса:

id column2 column3 uid    id1 column21 column31 uid1 
1  2  3  100931362  1  6  5  100931362 
2  3  4  100931362  1  6  5  100931362 
3  4  5  100931362  1  6  5  100931362 

=> У меня есть повторяющиеся строки из ПРИСОЕДИНЯЙТЕСЬ.

мне нужен результат:

id column2 column3 uid    id1 column21 column31 uid1 
1  2  3  100931362  1  6  5  100931362 
2  3  4  100931362  NULL NULL NULL NULL 
3  4  5  100931362  NULL NULL NULL NULL 
+0

Вы не можете сделать это с помощью левого соединения. Если ваши условия совпадают несколько раз, они собираются присоединиться несколько раз. Можете ли вы объяснить, почему вам нужны нулевые значения для последующих результатов? Если это по соображениям производительности, возможно, вам стоит взглянуть на выбор из нескольких таблиц вместо объединения, запросов объединения или даже временных таблиц для лучшей подгонки. –

+0

Можете ли вы объяснить, что вы пытаетесь сделать? Может быть, кто-то может дать полезный ответ другому решению. – ranisalt

+0

@scrowler, мне нужны только уникальные значения, поэтому я хочу получить значение NULL. Надеюсь, вы можете помочь мне с действительным запросом. Добавлена ​​дополнительная информация. – owl

ответ

1

Поскольку ваши структуры таблиц выглядят практически одинаково, есть и другие варианты для вас, чем просто присоединяется. Вот возможное решение, использующее unions:

Укажите имя поля вручную, определяющее, из какой таблицы берутся строки, чтобы вы могли отличить после объединения, потому что результаты будут выглядеть одинаково иначе.

SELECT 'l_req' AS table_name, id, column2, column3, uid FROM l_req WHERE uid = 100931362 
UNION ALL 
SELECT 'p_req' AS table_name, id, column2, column3, uid FROM p_req WHERE uid = 100931362 
UNION ALL 
SELECT 'r_req' AS table_name, id, column2, column3, uid FROM r_req WHERE uid = 100931362 

Я также себя здесь, что ваш r_req таблица имеет ту же структуру, как и другие. Вы можете ожидать результат этого запроса, который может выглядеть следующим образом:

table_name id column2 column3 uid 
l_req  1 2 3 100931362 
l_req  2 3 4 100931362 
l_req  3 4 5 100931362 
p_req  1 6 5 100931362 -- this is your extra result original from join 
+0

спасибо, но не было бы более продуктивным присоединиться? – owl

+0

@owl Вы пробовали мое решение –

0

Вы можете попробовать, как этот

Select id,column2,column3,Uid from 
(
SELECT * 
FROM l_req,ROW_NUMBER() OVER(PARTITION BY id,column2,column3 ORDER BY id ASC) AS RN 
LEFT JOIN p_req ON (p_req.uid = l_req.uid) 
LEFT JOIN r_req ON (r_req.uid = l_req.uid) 
WHERE l_req.uid = 100931362 
) AS T 

Where RN = 1 

(или)

Select Case when RN = 1 Then id Else Null End, 
     Case when RN = 1 Then column2 Else Null End, 
     Case when RN = 1 Then column3 Else Null End, 
     Case when RN = 1 Then uid Else Null End 
(
SELECT * 
FROM l_req,ROW_NUMBER() OVER(PARTITION BY id,column2,column3 ORDER BY id ASC) AS RN 
LEFT JOIN p_req ON (p_req.uid = l_req.uid) 
LEFT JOIN r_req ON (r_req.uid = l_req.uid) 
WHERE l_req.uid = 100931362 
) AS T 

Надеется, что это поможет вам

Смежные вопросы