SQL-запрос для выбора записей из трех таблиц отдельно - PullRequest
0 голосов
/ 15 апреля 2010

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

предположим, есть три истории Table1, Table2, Table3

Я хочу сначала показать записи таблицы 1 с некоторыми критериями фильтра а затем записи из таблицы 2 и, наконец, из Таблицы 3, когда мы выполняем представление, оно показывается как записи типа Таблицы

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

Ответы [ 7 ]

3 голосов
/ 15 апреля 2010

Я бы предложил использовать UNION ALL вместо union, если вам нужны все записи из каждой таблицы. 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
2 голосов
/ 15 апреля 2010

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

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

обратите внимание, что каждый из трех запросов должен иметь одинаковое количество столбцов и что типы данных также должны быть согласованными. Кроме того, я использовал 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 голос
/ 15 апреля 2010

Вы можете ОБЪЕДИНИТЬ три таблицы, следя за тем, чтобы все они возвращали одинаковое количество полей. Существует простой чит для управления порядком (см. Ниже):

ВЫБРАТЬ * ИЗ ( ВЫБЕРИТЕ a, b, c, 1 как ListOrder FROM table1 UNION ВЫБЕРИТЕ a, b, c, 2 как ListOrder FROM table2 UNION ВЫБЕРИТЕ a, b, c, 3 как ListOrder FROM table3 ) ЗАКАЗАТЬ по ListOrder

1 голос
/ 15 апреля 2010

Если ваши таблицы имеют одинаковые столбцы, вы можете использовать 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 голос
/ 15 апреля 2010

Как насчет:

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 голос
/ 15 апреля 2010

вы можете использовать запрос 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
0 голосов
/ 15 апреля 2010

Вы можете сделать что-то вроде этого - 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...