2015-03-11 7 views
0

Мне нужно сделать запрос со следующими критериями. У меня есть table1, table2 и table3. Мне нужно проверить, что каждый из table2 и table3 являются подмножествами table1.SQL Server: Регистрация в нескольких таблицах

Все содержание table1 должно присутствовать в table2 и/или table3. Все содержимое table1 может присутствовать только в table2, а иногда все содержимое table1 должно присутствовать только в table3. В других случаях table1 может быть содержанием table2 и table3. Не все в table2 должно соответствовать тому, что находится в table3.

Я хочу, чтобы запрос возвращал то, что присутствует в table1, а не в table2 и не в table3. Кроме того, он должен вернуть то, что присутствует в table2 и table3, а не в table1.

Я пробовал ниже, но он не работает. Вы хоть представляете, как это можно решить?

Select 
    dr1.col1, dr1.col2 
from 
    table1 dr1 
left outer join 
    (Select c.col1, col2 from table2) dr2 on dr1.col1 = dr2.col1 
              and dr1.col2 = dr2.col2 
left outer join 
    (Select col1, col2, col3 from tabl3) dr3 on dr1.col1 = dr3.col1 
               and dr1.col2 = dr3.col2 
               and dr1.col3 = dr3.col3 
where 
    dr1.col1 is NULL or dr2.col2 is NULL 
+0

Это где положение не совсем выглядеть правильно, проверяя DR1 и DR2 - вместо d2 и DR3 - и если его в DR1, но не в любом из dr2 или dr3 - вы бы проверяли dr2 AND dr3, а не OR. – Andrew

ответ

0

Кроме того, она должна вернуть то, что присутствует в table2 и Таблица3 и нет в table1.

Как вы можете отличаться между двумя, когда вы возвращаете все это в одном запросе?

К первоначальному вопросу, попробуйте следующее:

SELECT dr1.col1, dr1.col2 
FROM table1 dr1 
WHERE NOT EXISTS (
    SELECT 1 
    FROM table2 dr2 
    WHERE dr2.col1 = dr1.col1 
    AND dr2.col2 = dr1.col2) 
AND NOT EXISTS (
    SELECT 1 
    FROM table3 dr3 
    WHERE dr3.col1 = dr1.col1 
    AND dr3.col2 = dr1.col2) 

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

1

Использование FULL JOIN с UNION:

DECLARE @t1 TABLE (ID INT) 
DECLARE @t2 TABLE (ID INT) 
DECLARE @t3 TABLE (ID INT) 


INSERT INTO @t1 
VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9) 

INSERT INTO @t2 
VALUES (1),(2),(3),(4) 

INSERT INTO @t3 
VALUES (4),(5),(6),(7),(8),(10) 


SELECT ISNULL(t.ID, tt.ID) AS ID , 
     CASE WHEN t.ID IS NULL THEN 'Missing in Table 1' 
      ELSE 'Missing in Table 2, 3' 
     END AS MissingValue 
FROM @t1 t 
     FULL JOIN (SELECT ID FROM @t2 
        UNION 
        SELECT ID FROM @t3 
       ) tt ON t.ID = tt.ID 
WHERE t.ID IS NULL OR tt.ID IS NULL 

Выход:

ID MissingValue 
9 Missing in Table 2, 3 
10 Missing in Table 1 
+0

Несмотря на то, что это приятное решение, похоже, оно не возвращает то, что запрашивается: «Я хочу, чтобы запрос возвращал то, что присутствует в таблице1, а не находит в таблице2 или в таблице 3. Кроме того, он должен возвращать то, что присутствует в таблице2 и таблице3 и нет в таблице 1." – Mackan

+0

@Mackan, он возвращает эту информацию :) 9 является' то, что присутствует в таблице1, а не находится в таблице2 или в таблице3; ' 10 - это то, что он должен возвращать то, что присутствует в таблице2 и таблице3, и не присутствует в таблице1 ' –

+0

Ага, я думаю, мы интерпретируем запрос по-разному :) Я думал, что он захочет 1-9 из таблицы1, а также 10, так как он найден в таблице 3. Ваше решение имеет больше смысла (+1). – Mackan

0

Чтобы найти записи, представленные в таблице 1 и не представленные в таблице 2 и таблице3, вы можете использовать следующий запрос. Я предполагаю, что есть поле первичного ключа как для table2, так и для таблицы3, которое я называю ID. Я также исключил подзаголовок.

SELECT dr1.col1, dr1.col2 from table1 dr1 
    LEFT OUTER JOIN table2 dr2 
     ON dr1.col1 = dr2.col1 and dr1.col2 = dr2.col2 
    LEFT OUTER JOIN table3 dr3 
     ON dr1.col1 = dr3.col1 and dr1.col2 = dr3.col2 and dr1.col3 = dr3.col3 
    WHERE dr2.ID is NULL AND dr3.ID is NULL 

Если вы хотите узнать, что есть в таблице2 и таблице3, но не в таблице1, вы не можете выбрать из таблицы1. Вместо того, чтобы вы могли выбрать из table2, присоединился к Table3 и левое внешнее соединение таблицы 1:

SELECT dr2.col1, dr2.col2 from table2 dr2 
    INNER JOIN table3 dr3 
     ON dr2.col1 = dr3.col1 and dr2.col2 = dr3.col2 
    LEFT OUTER JOIN table1 dr1 
     ON dr1.col1 = dr2.col1 and dr1.col2 = dr2.col2 
    WHERE dr1.ID is NULL 
Смежные вопросы