设置运算符和外部列

时间:2019-05-09 12:23:39

标签: sql sql-server tsql

我有两个名为NewTableOldTable的表。每个表包含相同的列,分别是idtypename列。我在id和type列上使用了set运算符(例如:intersect)。这项工作很清楚。因此,我想添加name列以选择结果集,但这是一个条件。在进行操作时,请勿使用name列,这必须在结果集中提供它。

例如:

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

该查询应执行,并给我intersect行,并在NewTable中给附加名称列。

注意:我可以在intersect之后使用join运算符来实现。但我想直接得到它,不要使用join或其他。

我可以吗?

3 个答案:

答案 0 :(得分:1)

对于相交,您可以使用内部联接,而不是在相交之后,而不是相交。

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);

它从newtableid的{​​{1}} type组合中获取所有记录,这些记录不在名称为{{1 }},因为oldtable中显然没有名称。

答案 1 :(得分:1)

您无法使用INTERSECT来实现它,但是可以使用JOIN来做到这一点,如上所述,或者使用EXISTS

SELECT * FROM NewTable nt
WHERE EXISTS(SELECT 1 FROM OldTable
             WHERE id = nt.id
             AND type = nt.type)

答案 2 :(得分:1)

因此,我想您可以使用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];