2010-04-15 2 views
-1

SQL-запрос, который выбирает запись из трех таблиц, и между этими таблицами нет никакой связи. На самом деле я хочу сделать это ВИДОМ.SQL-запрос для выбора записей из трех таблиц отдельно

предположит, что есть три сказки Table1, Table2, Table3

Я хочу, чтобы показать записи Table1 первых с некоторыми критериями фильтрации , а затем записями из Table2 и в последнем из Table3, как, когда мы выполняем его просмотр показать, как записи как таблица.

Может быть любое количество строк, но записи должны быть в этой последовательности.

+0

Какова структура из трех таблиц? – CResults

+0

Есть ли причина, по которой вы не можете просто сделать 3 отдельных запроса и представить их пользователю/представлению по мере необходимости? – ewall

+0

Фактически число столбцов не одинаково. – Azhar

ответ

3

Я бы предложил использовать UNION ALL вместо объединения, если вы хотите, чтобы все записи от каждого o f таблицы. UNION будет использовать отдельный, чтобы отфильтровывать дубликаты. Если вам это не нужно, это просто замедляет запрос.

Дальнейшее объяснение: http://wiki.lessthandot.com/index.php/Union_All

Чтобы показать вам, как обращаться, если вы не имеете все столбцы в каждой таблице:

select 
    1 as seq,col1, col2, col3, cast(null as varchar (40)) as col4 
    FROM Table1 
    where ... 
UNION ALL 
select 
    2 as seq,'Unknown', col2, null, col4 
    FROM Table2 
    where ... 
UNION ALL 
select 
    3 as seq ,col1, col2, col3, cast(null as varchar (40)) as col4 
    FROM Table3 
    where ... 
ORDER BY seq 
+1

Но не может быть дубликатов, потому что должен быть какой-то новый столбец, который указывает порядок сортировки. Следовательно, невозможно будет иметь записи из первых записей соответствия со второго или третьего. – MJB

+0

Вот почему UNION ALL будет быстрее, так как у вас не будет системы, которая ищет дубликаты, которых у вас нет. – HLGEM

0

Вы можете сделать что-то вроде этого - WHERE ID = 34 просто пример фильтра:

create view vAllRecords as 
select 1 as Rank, Field1, Field2 from Table1 where ID = 34 
UNION 
select 2 as Rank, Field1, Field2 from Table2 
UNION 
select 3 as Rank, Field1, Field2 from Table3 

Использование UNION удалит все дубликаты. Если вы знаете, что дубликатов не будет, или вы хотите их увидеть, запрос будет работать быстрее с UNION ALL.

ORDER BY не допускается в представлениях, так что вам нужно сделать заказ рангом при выборе с точки зрения:

select * 
from vAllRecords 
order by Rank 
1

вы можете использовать UNION запрос:

SELECT Field1, Field2, Field3, '1' as Sequence FROM Table1 WHERE SomeCriteria 
UNION 
SELECT Field7, Field5, Field6, '2' FROM Table2 WHERE SomeCriteria 
UNION 
SELECT Field4, Field8, Field9, '3' FROM Table3 WHERE SomeCriteria 
2

попробовать:

select 
    1,col1, col2, col3 
    FROM Table1 
    where ... 
UNION ALL 
select 
    2,col1, col2, col3 
    FROM Table2 
    where ... 
UNION ALL 
select 
    3,col1, col2, col3 
    FROM Table3 
    where ... 
ORDER BY 1 

Обратите внимание, что каждый из трех запросов должен иметь одинаковое количество колонок ns и что типы данных также должны быть последовательными. Кроме того, я использовал UNION ALL для ускорения запроса, так как нет необходимости исключать дубликаты между тремя запросами, потому что таблица последовательности не гарантирует отсутствие дубликатов.

не иметь столбец последовательности в наборе результатов попробовать:

SELECT 
    col1,col2,col3 
    FROM (select 
      1 as seq,col1, col2, col3 
      FROM Table1 
      where ... 
      UNION ALL 
      select 
      2 as seq,col1, col2, col3 
      FROM Table2 
      where ... 
      UNION ALL 
      select 
      3 as seq,col1, col2, col3 
      FROM Table3 
      where ... 
     ) dt 
    ORDER BY seq 
1

Как о:

create view AZ_VIEW as 
select 1 as orderby, tbl1Col1 as col1, tbl1Col2 as col2, tbl1col3 as col3 from Table1 where criteria1='val' 
union 
select 2, tbl2Col1, tbl2Col2, tbl2col3 from Table2 where criteria2='anotherval' 
union 
select 3, tbl3Col1, tbl3Col2, tbl3col3 from Table3 where criteria3='athirdval' 
; 
1

Если таблицы имеют одинаковые столбцы, вы можете использовать Union All:

Select col1, col2, 1 As seq 
From table1 
Union All 
Select col1, col2, 2 As seq 
From table1 
Union All 
Select col1, col2, 3 As seq 
From table1 
Order By seq 
1

Вы можете UNION три таблицы, следя за тем, чтобы все они возвращали одинаковое количество полей.Существует простой обман для управления порядком (показанное ниже):

SELECT * FROM ( ВЫБРАТЬ, Ь, с, 1, как ListOrder ОТ table1 СОЕДИНЕНИЕ ВЫБРАТЬ а, б, в, 2, как ListOrder ОТ таблица2 СОЕДИНЕНИЕ ВЫБРАТЬ а, б, с, 3, как ListOrder оТ Table3 ) ORDER BY ListOrder

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