我需要使用以下条件进行查询。我有table1
,table2
和table3
。我需要检查table2
和table3
中的每一个是table1
的子集。
table1
的所有内容都应出现在table2
和/或table3
中。 table1
的所有内容都可以单独存在于table2
中,有时table1
的所有内容都只能出现在table3
中。其他时间table1
可能是table2
和table3
的内容。并非table2
中的所有内容都与table3
中的内容相匹配。
我希望查询返回table1
中的内容,但不会在table2
或table3
中找到。此外,它应该返回table2
和table3
中的内容,而不是table1
中的内容。
我已经尝试了以下但它似乎没有工作。你知道如何解决这个问题吗?
Select
dr1.col1, dr1.col2
from
table1 dr1
left outer join
(Select c.col1, col2 from table2) dr2 on dr1.col1 = dr2.col1
and dr1.col2 = dr2.col2
left outer join
(Select col1, col2, col3 from tabl3 ) dr3 on dr1.col1 = dr3.col1
and dr1.col2 = dr3.col2
and dr1.col3 = dr3.col3
where
dr1.col1 is NULL or dr2.col2 is NULL
答案 0 :(得分:1)
将FULL JOIN
与UNION
:
DECLARE @t1 TABLE ( ID INT )
DECLARE @t2 TABLE ( ID INT )
DECLARE @t3 TABLE ( ID INT )
INSERT INTO @t1
VALUES ( 1 ),( 2 ),( 3 ),( 4 ),( 5 ),( 6 ),( 7 ),( 8 ),( 9 )
INSERT INTO @t2
VALUES ( 1 ),( 2 ),( 3 ),( 4 )
INSERT INTO @t3
VALUES ( 4 ),( 5 ),( 6 ),( 7 ),( 8 ),( 10 )
SELECT ISNULL(t.ID, tt.ID) AS ID ,
CASE WHEN t.ID IS NULL THEN 'Missing in Table 1'
ELSE 'Missing in Table 2, 3'
END AS MissingValue
FROM @t1 t
FULL JOIN ( SELECT ID FROM @t2
UNION
SELECT ID FROM @t3
) tt ON t.ID = tt.ID
WHERE t.ID IS NULL OR tt.ID IS NULL
输出:
ID MissingValue
9 Missing in Table 2, 3
10 Missing in Table 1
答案 1 :(得分:0)
此外,它应该返回table2和table3中的内容,而不是table1中的内容。
当您在一个查询中全部返回时,您希望两者之间有什么不同?
对于原始问题,请尝试以下方法:
SELECT dr1.col1, dr1.col2
FROM table1 dr1
WHERE NOT EXISTS (
SELECT 1
FROM table2 dr2
WHERE dr2.col1 = dr1.col1
AND dr2.col2 = dr1.col2)
AND NOT EXISTS (
SELECT 1
FROM table3 dr3
WHERE dr3.col1 = dr1.col1
AND dr3.col2 = dr1.col2)
通过这种方式,您可以获得表1中不在表2或表3中的所有数据。
答案 2 :(得分:0)
要查找table1中存在且不存在于table2和table3中的记录,可以使用以下查询。我假设table2和table3上都有一个主键字段,我将其称为ID
。我也删除了子选择。
SELECT dr1.col1, dr1.col2 from table1 dr1
LEFT OUTER JOIN table2 dr2
ON dr1.col1 = dr2.col1 and dr1.col2 = dr2.col2
LEFT OUTER JOIN table3 dr3
ON dr1.col1 = dr3.col1 and dr1.col2 = dr3.col2 and dr1.col3 = dr3.col3
WHERE dr2.ID is NULL AND dr3.ID is NULL
如果您想知道table2和table3中的内容,而不是table1中的内容,则无法从table1中进行选择。相反,您可以从table2中选择,连接到table3和左外连接表1:
SELECT dr2.col1, dr2.col2 from table2 dr2
INNER JOIN table3 dr3
ON dr2.col1 = dr3.col1 and dr2.col2 = dr3.col2
LEFT OUTER JOIN table1 dr1
ON dr1.col1 = dr2.col1 and dr1.col2 = dr2.col2
WHERE dr1.ID is NULL