Поиск, чтобы определить, совпадает ли значение ключа из одной таблицы со значением ключа из другой таблицы - PullRequest
0 голосов
/ 01 мая 2019

Я объединяю две таблицы (я буду называть их таблицами Table1 и Table3). Значение ключа из таблицы 1 (допустим, CompareValue1) используется в таблице 3 (хотя и под другим именем CompareValue2).

С моей структурой базы данных compareValue1 не обязательно должен совпадать с CompareValue2.

Я хочу написать запрос Select, который принимает CompareValue1, просматривает Table2 и показывает мне DataPoints, где CompareValue1! = CompareValue2.

Запросы, которые я пробовал до сих пор, не собирают все, что мне нужно. Для данной DataPoint compareValue1! = CompareValue2, поэтому, когда я ищу это простое отношение, мой запрос исключает только случаи, когда CompareValue1 = compareValue2.

Надеюсь, это имеет смысл, извините, если мое объяснение недостаточно техническое / запутанное.

Обновление: я воссоздал некоторые данные, которые лучше иллюстрируют проблему (и удалил старую упрощенную версию). Запрос Мэтью, кажется, не сделал именно то, что я ищу. Кроме того, я упростил свой оригинальный запрос. В действительности мне нужно соединить table1 с table2, чтобы я мог соединить table3 и сравнить значение из table1 в table3.

    DECLARE @table1 as TABLE (Key1 INT, compareValue1 INT)

    DECLARE @table2 as TABLE (Key1 INT, Key2 varchar(5), compareValue1 INT, compareValue2 INT)

    DECLARE @table3 as TABLE (Key2 varchar(5), compareValue2 INT)

    INSERT INTO @table1 (Key1, compareValue1)
    VALUES (1, 1)
    ,      (1, 5)
    ,      (2, 7)
    ,      (3, 10)

    INSERT INTO @table2 (Key1, Key2, compareValue1, compareValue2)
    VALUES (1, 'a', 1, 1)
    ,      (1, 'a', 1, 3)
    ,      (1, 'a', 1, 12)
    ,      (1, 'a', 5, NULL)
    ,      (1, 'a', 5, 7)
    ,      (1, 'b', 5, 3)
    ,      (2, 'b', 7, 7)
    ,      (2, 'b', 7, 2)
    ,      (2, 'h', 7, 7)
    ,      (3, 'c', 10, 3)
    ,      (3, 'c', 10, NULL)
    ,      (3, 'd', 10, 6)
    ,      (3, 'b', 10, 11)

    INSERT INTO @table3 (Key2, compareValue2)
    VALUES ('a', 1)
    ,      ('a', 3)
    ,      ('a', 12)
    ,      ('a', NULL)
    ,      ('a', 7)
    ,      ('b', 3)
    ,      ('b', 7)
    ,      ('b', 2)
    ,      ('h', 7)
    ,      ('c', 3)
    ,      ('c', NULL)
    ,      ('d', 6)
    ,      ('b', 11)

    SELECT *
    FROM @table2 T2
    LEFT OUTER JOIN @table1 T1
    ON T1.Key1 = T2.Key1
    LEFT OUTER JOIN @table3 T3
    ON T3.Key2 = T2.Key2

Фильтрация необходимых объединений - вот где я сталкиваюсь с проблемами. В моем операторе Select в таблице 2 я хотел бы видеть следующие точки данных.

    (1, 'a', 5, NULL)
    (1, 'a', 5, 7)
    (1, 'b', 5, 3)
    (3, 'c', 10, 3)
    (3, 'c', 10, NULL)
    (3, 'd', 10, 6)
    (3, 'b', 10, 11)

Что у них всех общего? Взятый как группа, основанная на данных таблицы1 ([1,5] и [3,10]), CompareValue1 никогда не равняется CompareValue2.

    (1, 'a', 1, 1)
    (2, 'b', 7, 7)
    (2, 'h', 7, 7)

В этом смысле приведенные выше значения не позволят данным таблицы1 ([1,1] и [2,7]) появиться в результатах моего запроса, поскольку существуют точки, где compareValue1 = compareValue2 ДАЖЕ ЧЕРЕЗ, что не всегда верно. И.Е. (1, «а», 1, 3).

Спасибо, что нашли время подумать.

Ответы [ 2 ]

0 голосов
/ 01 мая 2019

Вы можете использовать outer join в любой форме.

  • left outer join возвращает все записей из левой таблицы и null с правой стороны, где нет совпадений.
  • right outer join возвращает все записи из правой таблицы и null с левой стороны, где нет совпадений.
  • full outer join включает в себя left и right.

    Так что запрос может быть таким:

    select * from t1 full outer join t2 on t1.key1 = t2.key2 where t1.key1 is null or t2.key2 is null --select mismatches only

0 голосов
/ 01 мая 2019

Не уверен, что это то, что вы ищете:

DECLARE @table1 AS TABLE (Key1 INT);

DECLARE @table2 AS TABLE (Key2 INT);

INSERT INTO @table1 (Key1)
VALUES (NULL)
,      (1)
,      (2)
,      (3);

INSERT INTO @table2 (Key2)
VALUES (NULL)
,      (1)
,      (2)
,      (3);

SELECT          *
  FROM          @table1 T1
 CROSS APPLY    @table2 T2
 WHERE          ISNULL(T1.Key1, -1) <> ISNULL(T2.Key2, -1)
 ORDER BY Key1
,         Key2;

Обратите внимание, что я добавил два TVP в начале и вставил в них данные.Если вы можете предоставить такой сценарий со своим вопросом и предлагаемыми результатами, тогда вам будет намного легче помочь вам в будущем.

Если я пропустил отметку, отредактируйте ваш вопрос и упростите задачу.следуйте, и мы постараемся помочь.

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...