我正在联接两个表(我将它们称为表1和表3)。表3中使用了表1中的键值(假设为compareValue1)(尽管名称不同,其名称为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
在遇到必要的联接时进行筛选。我希望在table2的Select语句中看到以下数据点。
(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)
这些都有什么共同点?根据table1的数据([1,5]和[3,10])作为一个组,compareValue1永远不等于compareValue2。
(1, 'a', 1, 1)
(2, 'b', 7, 7)
(2, 'h', 7, 7)
从这种意义上讲,上述值将阻止table1的数据([1,1]和[2,7])出现在我的查询结果中,因为存在点,其中compareValue1 = compareValue2甚至不总是如此。即(1,'a',1,3)。
感谢您抽出宝贵的时间对此进行思考。
答案 0 :(得分:0)
不确定这是否是您要寻找的东西
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,并将数据插入其中。如果您可以在问题和建议的输出中提供类似的脚本,那么将来可以更轻松地为您提供帮助。
如果我错过了分数,请编辑您的问题,使事情更容易理解,我们将尽力提供帮助。
祝你好运。
答案 1 :(得分:0)
您可以以任何形式使用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