如何只选择那些在TSQL中具有不同字符串的行?

时间:2018-08-06 08:34:52

标签: sql sql-server-2008 tsql join

我有这个查询

select p.ID, dp.ID
from MyDB.dbo.Table1 as p
inner join MyDB.dbo.Table2 as dp
on p.Title = dp.Title

它比较两个字符串(varchars),并给出113行,这是正确的结果。

我不确定应该如何在TSQL中获取仅p.Title与dp.Title不同的ID /行。

使用内部联接,或左联接或右联接,可以得到笛卡尔积,即32000行。像这样:

select p.ID, dp.ID
from MyDB.dbo.Table1 as p
join MyDB.dbo.Table2 as dp
on p.Title <> dp.Title

我应该使用一些字符串函数来比较字符串,还是找到IS NULL结果? 我需要获取p.ID和dp.ID的组合。

注意:两个表的ID都没有链接,或者预先已知是相同的,即是必需的。

4 个答案:

答案 0 :(得分:2)

尝试以下查询-:

select a.ID,b.ID from (
select ID,ROW_NUMBER() over (order by ID) rn 
from MyDB.dbo.Table1 
where ID 
not in (select MyDB.dbo.Table1.ID from MyDB.dbo.Table1 join MyDB.dbo.Table2 on MyDB.dbo.Table1.name=MyDB.dbo.Table2.name) 
)a 
full outer join (
select ID,ROW_NUMBER() over (order by ID) rn 
from MyDB.dbo.Table2 
where ID 
not in (select MyDB.dbo.Table2.ID from MyDB.dbo.Table1 join MyDB.dbo.Table2 on MyDB.dbo.Table1.name=MyDB.dbo.Table2.name) 
) b 
on  a.rn=b.rn

SQL Server 2014

答案 1 :(得分:1)

@Vlad,您需要首先通过ID链接内部联接(p.ID = dp.ID)。然后在where子句中比较标题,如下所示:

select p.ID, dp.ID
from MyDB.dbo.Table1 as p
inner join MyDB.dbo.Table2 as dp
on p.ID=dp.ID
where
    p.Title <> dp.Title

答案 2 :(得分:1)

答案 3 :(得分:0)

我不确定您追求什么。以下是一些小提琴,显示了标题“不平等”的简单连接:http://rextester.com/TFIXP19067

select p.ID id1, dp.ID id2, p.title t1, dp.title t2
from Table1 as p
inner join Table2 as dp
on p.Title != dp.Title

此查询将为您提供类似于“笛卡尔积”的结果。但这是可以预料的,因为除了两个标题之间的不平等之外,您对JOIN的其他条件没有其他限制。

从给出其他答案的观点来看,我想您对笛卡尔乘积解决方案不感兴趣。在那种情况下,也许有效的解决方案是列出两个表,一个在另一个表之后(在下面!),限制为在另一个表中没有等价的那些表?喜欢

select * from Table1 where not exists ( select 1 from table2 where table2.title=table1.title );
select * from Table2 where not exists ( select 1 from table1 where table1.title=table2.title )

请参阅此处:http://rextester.com/RVJRVG86860

请注意:

通过此查询,您将获得所有不同的表条目,而不管每个表中有多少个条目。如果两个表具有不同的记录计数,则被IShubh接受的答案将仅列出“成对”的条目,而不会列出所有条目