запрос с объединением 3 таблиц - PullRequest
3 голосов
/ 22 июля 2010

Я хочу, чтобы один запрос дал следующие результаты ..

Чтобы получить записи, которые находятся в таблице1 и в таблице2 и не были в таблице3.

В каждой таблице более 10000 записей ... так что я ищу эффективную. Во всей таблице Коно является первичным ключом ..

Подробно с таблицами.

ТАБЛИЦА 1: -

Cono     

th-123
th-124
th-125

ТАБЛИЦА 2: -

Cono     

th-234
th-245
th-256

ТАБЛИЦА 3: -

Cono     

th-124
th-125
th-256

Теперь я хочу получить следующие записи

Таблица результатов: -

Cono     

th-123
th-234
th-245

Ответы [ 6 ]

3 голосов
/ 22 июля 2010

Попробуйте это

WITH Table1 AS
(
    SELECT 'th-123' CONO UNION
    SELECT 'th-124' UNION
    SELECT 'th-125'
)
,
Table2 AS
(
    SELECT 'th-234' CONO UNION
    SELECT 'th-245' UNION
    SELECT 'th-256'
)
,
Table3 AS
(
    SELECT 'th-124' CONO UNION
    SELECT 'th-125' UNION
    SELECT 'th-256'
)

SELECT CONO
FROM Table1 
WHERE NOT EXISTS
(
    SELECT 1
    FROM Table3
    WHERE TABLE1.CONO = TABLE3.CONO
)

UNION ALL

SELECT CONO
FROM Table2
WHERE NOT EXISTS
(
    SELECT 1
    FROM Table3
    WHERE TABLE2.CONO = TABLE3.CONO
)
1 голос
/ 22 июля 2010
(SELECT t1.Cono FROM table1 t1
LEFT JOIN table3 t3
ON t3.Cono = t1.Cono
WHERE t3.Cono IS NULL)
UNION ALL
(SELECT t2.Cono FROM table2 t2
LEFT JOIN table3 t3
ON t3.Cono = t2.Cono
WHERE t3.Cono IS NULL)
1 голос
/ 22 июля 2010

попробуйте это:

select t.cono from Table1 t WHERE NOT EXISTS (SELECT 1 
                                              FROM Table3 x WHERE x.cono=t.cono)
UNION
select t.cono from Table2 t WHERE NOT EXISTS (SELECT 1 
                                              FROM Table3 x WHERE x.cono=t.cono)
0 голосов
/ 22 июля 2010

это сработало для меня ... и быстро обрабатывается:

select X.FID, c.id as CID 
from
(
    select a.id as FID from tbl1 a
    union 
    select b.id as FID from tbl2 b
) as X
 left outer join tbl3 c on FID = c.id
where
    c.id is null
;
0 голосов
/ 22 июля 2010

Вид туманных таблиц и имен, но вот что вы можете сделать, если ДЕЙСТВИТЕЛЬНО хотите сделать это одним запросом:

SELECT Cono
FROM Table3
WHERE NOT EXISTS ( SELECT Cono
                   FROM TABLE1 as T
                   WHERE EXISTS ( SELECT *
                                  FROM TABLE2
                                  WHERE T.Cono = TABLE2.Cono));

При этом следует выбрать значения в таблице 3, которые не существуют в запросе, созданном в скобках, то есть в таблице, состоящей из строк в таблицах 1 и 2.

К сожалению, вложенность и эффективность обычно не идут рука об руку ...

0 голосов
/ 22 июля 2010

Попробуйте это (не проверено):

; WITH all_data AS (
   SELECT * FROM table1
   UNION ALL
   SELECT * FROM table2
)
SELECT * 
FROM all_data ad
WHERE NOT EXISTS (
   SELECT *
   FROM table3 t3
   WHERE ad.Cono = t3.Cono);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...