Установить оператор и внешний столбец - PullRequest
0 голосов
/ 09 мая 2019

У меня есть две таблицы с именами NewTable и OldTable.Каждая таблица содержит одинаковые столбцы, которые являются столбцами id, type и name.Я использую оператор set (например: intersect) над столбцами id и type.Эта работа четко.Поэтому я хочу добавить столбец name, чтобы выбрать набор результатов, но с одним условием.При обработке оператор не должен использовать столбец name, это должно быть указано в наборе результатов.

Например:

SELECT id, type FROM NewTable
INTERSECT
SELECT id, type FROM OldTable

Этот запрос должен быть выполнен и дать мне intersect строку, столбец имени дополнения в NewTable.

Примечание: я могу это сделатьс оператором соединения после intersect.Но я хочу получить его напрямую, чтобы не использовать join или другие.

Могу ли я сделать это?

Ответы [ 3 ]

1 голос
/ 09 мая 2019

Вы не можете достичь этого с INTERSECT, но вы можете сделать это с JOIN, как уже упоминалось, или с EXISTS:

SELECT * FROM NewTable nt
WHERE EXISTS(SELECT 1 FROM OldTable
             WHERE id = nt.id
             AND type = nt.type)
1 голос
/ 09 мая 2019

Так что, я думаю, вы могли бы достичь этого с помощью INTERSECT, но не так, как это имеет смысл, например:

SELECT id, [type], [name] FROM NewTable
INTERSECT
SELECT o.id, o.[type], n.[name] FROM OldTable o INNER JOIN NewTable n ON n.id = o.id AND n.[type] = o.[type];
1 голос
/ 09 мая 2019

Для пересечения вы можете использовать внутреннее соединение, не после пересечения, а вместо.

SELECT DISTINCT
       n.id,
       n.type,
       n.name
       FROM newtable n
            INNER JOIN oldtable o
                       ON o.id = n.id
                          AND o.type = n.type;

Для кроме вы можете использовать NOT EXISTS и коррелированный подзапрос.

SELECT DISTINCT
       n.id,
       n.type,
       n.name
       FROM newtable n
            WHERE NOT EXISTS (SELECT *
                                     FROM oldtable o
                                     WHERE o.id = n.id
                                           AND o.type = n.type);

Я не уверен, что вы ищете профсоюз, возможно, это работает для вас:

SELECT n.id,
       n.type,
       n.name
       FROM newtable n
UNION 
SELECT o.id,
       o.type,
       NULL name
       FROM oldtable o
            WHERE NOT EXISTS (SELECT *
                                     FROM newtable n
                                     WHERE n.id = o.id
                                           AND n.type = o.type);

Он получает все записи из комбинаций newtable и id type из oldtable, которых нет в новой таблице с именем NULL, поскольку, очевидно, нет имени для это в newtable.

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