SQL Server full outer连接多个断开连接的表

时间:2014-12-14 09:40:42

标签: sql sql-server

我是SQL Server的新手,所以请求你不要被愚蠢的问题弄得冒犯。

我的数据库中有六个脱节表(table1,table2(要查询的两列),table3,table4,table5,table6(这是表5的子表))。

这些是不同的表,我想使用单个查询从每个表中的一列搜索数据,如果找到则填充行。

我正在运行以下查询

 SELECT 
     table1.*
     , table2.*
     , table3.*
     , table4.*
     , table5.*
     , table6.*
FROM
    dbo.table1
FULL OUTER JOIN 
    dbo.table2 ON table1.col1 = table2.col_A OR table1.col1 = table2.col_B
FULL OUTER JOIN 
    dbo.table3 ON table2.col_A = table3.col_F OR table2.col_B = table3.col_F
FULL OUTER JOIN 
    dbo.table4 ON table3.col_F = table4.col_I
FULL OUTER JOIN 
    dbo.table5 ON table4.col_I = table5.col_N
INNER JOIN 
    dbo.table6 ON table5.col_N = table6.col_U OR table5.col_N = table6.col_V
WHERE
    table1.col1 LIKE '%' + USERINPUT + '%'
    OR table2.col_A LIKE '%' + USERINPUT + '%'
    OR table2.col_B LIKE '%' + USERINPUT + '%'
    OR table3.col_F LIKE '%' + USERINPUT + '%'
    OR table4.col_I LIKE '%' + USERINPUT + '%'
    OR table5.col_N LIKE '%' + USERINPUT + '%'

但是我没有得到所有表格的结果。但是当我单独跑步时,我得到了正确的结果。例如

SELECT table1.*
FROM dbo.table1
WHERE
       table1.col1 LIKE '%' + USERINPUT + '%'

SELECT table5.* , table6.*
FROM
   dbo.table5
INNER JOIN 
   dbo.table6 ON table5.col_N = table6.col_U OR table5.col_N = table6.col_V
WHERE
   table5.col_N LIKE '%' + USERINPUT + '%'

所有帮助都有助于解决这个问题。简而言之,希望在所有表中运行单个查询并仅显示匹配的行

1 个答案:

答案 0 :(得分:0)

我认为这里的问题是您使用full outer join,但条件需要匹配。

例如,考虑加入table4

ON table3.col_F = table4.col_I

好吧,要从Table4获取任何匹配的行,您必须在NULL中拥有非table3.col_F值。但是,由于full outer join,可能会有很多NULL个值。这并没有将结构转换为inner join,但它最终会在自己的行上生成许多table4个值,其他所有值都为NULL

除非你真的知道自己在做什么,否则你可能不需要full outer join。有时,您可以将此类查询重新定义为带有聚合的union all,或者只使用left joininner join