Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL条件联接(内部或外部)_Sql_Join - Fatal编程技术网

SQL条件联接(内部或外部)

SQL条件联接(内部或外部),sql,join,Sql,Join,我想知道在选择要执行的连接时是否可以执行条件语句。我的意思的一个例子可能是: SELECT * FROM Table1 IF (TRUE) THEN INNER JOIN ELSE (FALSE) THEN OUTER JOIN END Table2 ON (SOME CONDITION) 这显然不起作用,但我认为它更好地说明了我的问题。你希望得到什么还不清楚。您是否希望IF在逐行的基础上工作,或者在整个查询中工作一次 在任何情况下,您都可以通过外部联接获得所需的结果,然后使用WHERE子句过

我想知道在选择要执行的连接时是否可以执行条件语句。我的意思的一个例子可能是:

SELECT * FROM Table1
IF (TRUE) THEN INNER JOIN
ELSE (FALSE) THEN OUTER JOIN
END
Table2 ON (SOME CONDITION)

这显然不起作用,但我认为它更好地说明了我的问题。

你希望得到什么还不清楚。您是否希望IF在逐行的基础上工作,或者在整个查询中工作一次


在任何情况下,您都可以通过外部联接获得所需的结果,然后使用WHERE子句过滤结果。

否。如果有必要,您需要动态生成查询字符串,然后执行它。或者始终执行外部联接,并根据条件选择前端中实际使用的列。在没有更多信息的情况下,很难说在任何给定的情况下哪个更有意义。

这假设内部和外部都有相同的列

当然,外部联接包括内部联接:唯一的区别是如何处理不匹配的行,这些行可以在WHERE子句中排序

SELECT
   col1, col2
FROM
   Table1
   LEFT OUTER JOIN
   Table2 ON ... (SOME CONDITION)
WHERE
   (conditional = true AND table2.key IS NOT NULL)
   OR
   (conditional = false AND table2.key IS NULL)

使用OR不能保证性能,但您可以创建两个联接,然后使用条件选择从哪个联接中提取某个输出列的数据

Select Case When [Some boolean condition]
        Then A.ColumnName
        Else B.ColumnName End as OutputColumnName
   From Table 
     Left Join OneTable As A
        On [Join conditions]
     Left Join OtherTable As B
        On [Join conditions]
这可以通过同样的方式修改,以解决您的具体问题[内部、外部]

  Select Case When [Some boolean condition]
        Then A.ColumnName
        Else B.ColumnName End as OutputColumnName
   From Table 
     [Inner] Join TheTable As A
        On [Join conditions]
     Left [Outer] Join TheTable As B
        On [Join conditions]

非常感谢。你的解决方案对我也很有效。回想起来,这似乎非常简单和明显;-)如果表2是巨大的(数百万条记录),如果不满足条件,我根本不想加入呢?