我有这个查询
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都没有链接,或者预先已知是相同的,即是必需的。
答案 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)
您可能正在搜索类似INTERSECT的操作
答案 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接受的答案将仅列出“成对”的条目,而不会列出所有条目。