2015-11-12 2 views
1

запросаВозврат нескольких строк из нескольких SELECT, подзапроса

SELECT 
    (SELECT NAME FROM product_component) AS pcNAME, 
    (SELECT PROJECT_NAME FROM jira_project) AS jpNAME, 
    (SELECT FILTER_NAME FROM jira_filter) AS jfNAME 

Каждый ВЫБРАТЬ возвращает неопределенное количество строк. Я получаю ошибку Subquery returns more than 1 row. Мой желаемый результат будет что-то вроде этого (быстрый набросок):

======================================= 
| pcNAME | jpNAME | jfNAME | 
======================================= 
| data | data | data | 
+------------+------------+-----------+ 
| data | data | data | 
+------------+------------+-----------+ 
| data | data | data | 
+------------+------------+-----------+ 
|   | data | data | 
+------------+------------+-----------+ 
|   | data | data | 
+------------+------------+-----------+ 
|   | data |   | 
+------------+------------+-----------+ 

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

ПРИМЕЧАНИЕ: Ни одна из этих таблиц не общий столбец так не может достичь, как INNER JOIN

Любые идеи о том, как это может быть достигнуто?

+0

ли эти таблицы имеет поле автоматического приращения идентификаторов? Если да, вы можете использовать их для присоединения к ним. – Shadow

+0

@ GarethD Кортежи не имеют значения. Все, что я пытаюсь сделать, это отобразить все данные из этих трех таблиц. Данные могут быть неупорядочены – wmash

+0

@ Shadow да, у всех есть поле AI – wmash

ответ

4

Один из способов справиться с этим в MySQL использовать для переменных, union all и агрегации:

SELECT MAX(NAME) as NAME, MAX(PROJECT_NAME) as PROJECT_NAME, 
     MAX(FILTER_NAME) as FILTER_NAME 
FROM ((SELECT (@rnpc := @rnpc + 1) as rn, NAME, NULL as PROJECT_NAME, NULL as FILTER_NAME 
     FROM product_component CROSS JOIN 
      (SELECT @rnpc := 0) params 
    ) UNION ALL 
     (SELECT (@rnpn := @rnpn + 1) as rn, NULL, PROJECT_NAME, NULL as FILTER_NAME 
     FROM jira_project CROSS JOIN 
      (SELECT @rnpn := 0) params 
    ) UNION ALL 
     (SELECT (@rnf := @rnf + 1) as rn, NAME, NULL as PROJECT_NAME, NULL as FILTER_NAME 
     FROM jira_filter CROSS JOIN 
      (SELECT @rnf := 0) params 
    ) 
    ) t 
GROUP BY rn 
ORDER BY rn; 
+0

Блестящий ответ !! Спасибо. Никогда не думал о переменных – wmash