Select 单选合并多个联接

Select 单选合并多个联接,select,join,Select,Join,我试图弄清楚如何编写一个SQL查询,返回另外两个SELECT语句的结果,每个语句都有自己的JOIN。以下是场景: 表1的T1Number和/或T1State列中可能有空值。表2可能有编号或状态匹配的行。我想要表1中的所有行,但要在状态匹配时用T2Number填充任何空T1Number,在数字匹配时用T2State填充任何空T1State。我不希望表2中没有匹配状态或编号的行: Table1: Table2: Name T1Number T1S

我试图弄清楚如何编写一个SQL查询,返回另外两个SELECT语句的结果,每个语句都有自己的JOIN。以下是场景:

表1的T1Number和/或T1State列中可能有空值。表2可能有编号或状态匹配的行。我想要表1中的所有行,但要在状态匹配时用T2Number填充任何空T1Number,在数字匹配时用T2State填充任何空T1State。我不希望表2中没有匹配状态或编号的行:

Table1:                         Table2:

Name  T1Number  T1State         T2Number  T2State
----  --------  -------         --------  -----
Joe   1         NULL            1         MA
Bob   NULL      CA              2         CA
Dan   NULL      NULL            3         FL
Sam   4         NY              4         NY
Ray   5         TX              8         PA
因此,我有一个SELECT语句来获取数字:

SELECT 
  Table1.Name,
  Table1.T1Number,
  Table1.T1State,
  Table2.T2Number,
  Table2.T2State
FROM Table1
INNER JOIN Table2 ON Table2.T2State = Table1.T1State
WHERE (Table1.T1Number IS NULL OR Table1.T1State IS NULL)

Result:

Name  T1Number  T1State  T2Number  T2State
----  --------  -------  --------  -------     
Bob   NULL      CA       2         CA
和另一个SELECT语句来获取状态:

SELECT
  Table1.Name,
  Table1.T1Number,
  Table1.T1State
  Table2.T2Number
  Table2.T2State
FROM Table1
INNER JOIN Table2 ON Table2.T2Number = Table1.T1Number
WHERE (Table1.T1Number IS NULL OR Table1.T1State IS NULL)

Result:

Name  T1Number  T1State  T2Number  T2State
----  --------  -------  --------  -------     
Joe   1         NULL     1         MA
如何编写一个组合SELECT语句,以获得以下所需结果

Name  Number  State
----  ------  -----     
Joe   1       MA 
Bob   2       CA
Dan   NULL    NULL
Sam   4       NY
Ray   5       TX

我假设我需要一个包含SELECT语句,它在Table1和上述查询的并集之间进行左连接,但我知道这比我现在做的要简单。非常感谢。

您可以在
join
操作中使用单个
select
语句,而不使用
where
子句和
case
语句。比如:

SELECT t1.Name
     , CASE WHEN t1.Number is null then t2.Number else t1.Number END as Number
     , CASE WHEN t1.State is null then t2.State else t1.State end as State
FROM Table1 t1
LEFT JOIN Table2 t2 
ON CASE WHEN t1.Number is null THEN t1.State 
        ELSE CONVERT(varchar(1), t1.Number) END
    = CASE WHEN t1.Number is null THEN tab2.State 
           ELSE CONVERT(varchar(1), t2.Number) END