【问题标题】:Apply Same where clause to both sides of outer join with the same table structure将相同的 where 子句应用于具有相同表结构的外部连接的两侧
【发布时间】:2015-12-04 21:54:31
【问题描述】:

我正在两个具有完全相同结构的表上执行outer join。我的表是year1year2

在下面的示例中,两个表都有字段fieldA

我从嵌套选择开始,以避免Ambiguous column name 'fieldA'出现问题

选项1:太慢了

  select * from (
     select * from year1 
     outer join year2
     on year1.fieldB= year2.fieldB) fullQuery
     where fieldA <> 'foo' 

但是这最终太慢了,所以我需要“复制”每个表的 where 子句

选项 2:快,但我们的应用程序在 where 子句中没有提供表前缀

  select * from year1 
     outer join year2
     on year1.fieldB= year2.fieldB 
     where year1.fieldA <> 'foo' and year2.fieldA <> 'foo' 
      --where clause duplicated for the tables

不幸的是,我们的应用程序生成了一个没有表前缀的长 where 子句,尝试在应用程序中进行字符串操作以插入它们会很麻烦

问题:

如果不将表名附加到 where 子句的每个条件,如何避免 ambiguous column name

【问题讨论】:

  • 不幸的是,如果没有表名,您将无法避免 TSQL 中的错误。您可以为每一年创建一个视图,并为视图中的列添加前缀(第 1 年视图中的 ID 为 year1_id),然后加入视图。另一种选择是创建动态查询,具体取决于您的应用程序正在做什么以及您对其拥有多少控制权,但如果您无法控制应用程序输入,则会存在风险。
  • 根据需要创建一个 VIEW,并从应用程序中引用它。
  • 您可以查看同义词 (msdn.microsoft.com/en-gb/library/ms187552.aspx)。虽然我认为上面的 VIEW 建议是一个更好的方法。

标签: sql-server outer-join


【解决方案1】:

您的 sql 中的 OUTER JOIN 处存在语法错误,您无法在子选择中选择多于 1 列同名的行,我已更正此问题。 不得不使用一种奇怪的解决方法来防止在 WHERE 子句中使用前缀。这是查询:

SELECT *
FROM 
  year1
JOIN
  (SELECT 1 x) x -- this way rows where fieldA='foo' is eliminated
ON               -- without using the WHERE clause
  year1.fieldA <> 'foo'
LEFT JOIN -- outer join is incorrect syntax
  year2 
ON
  year1.fieldB= year2.fieldB
  and year2.fieldA <> 'foo'

【讨论】:

    【解决方案2】:

    您可以尝试命名子查询来实现结果。

     SELECT * FROM (
            ( SELECT * FROM year1 where  fieldA <> 'foo' ) year1
            FULL OUTER JOIN 
            ( SELECT * FROM year2 where  fieldA <> 'foo' ) year2
            ON year1.fieldB= year2.fieldB
         )
    

    您可以使用视图而不是命名子查询。

    请注意,这不是最佳解决方案,但考虑到您的 在这种情况下,它应该是一个可行的解决方法。

    【讨论】:

    • 您的答案继承了与原始问题相同的语法错误,您还通过未命名子选择引入了一个新错误
    • @t-clausen.dk ,现在尝试使用查询。正确的语法是使用FULL OUTER JOIN
    猜你喜欢
    • 1970-01-01
    • 2013-02-01
    • 2020-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    相关资源
    最近更新 更多