SQL Server:加入几个表

时间:2015-03-11 09:33:08

标签: sql sql-server join

我需要使用以下条件进行查询。我有table1table2table3。我需要检查table2table3中的每一个是table1的子集。

table1的所有内容都应出现在table2和/或table3中。 table1的所有内容都可以单独存在于table2中,有时table1的所有内容都只能出现在table3中。其他时间table1可能是table2table3的内容。并非table2中的所有内容都与table3中的内容相匹配。

我希望查询返回table1中的内容,但不会在table2table3中找到。此外,它应该返回table2table3中的内容,而不是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 

3 个答案:

答案 0 :(得分:1)

FULL JOINUNION

一起使用
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