SQL - Null值应与另一个表的非null值匹配

时间:2014-05-04 05:09:09

标签: sql

表1

Column1    Column2   Column 3  
A           Null       12

B           Null       15

C           0          15

表2

Column2     Column3

0            15

0            12

我有表1和表2,这里我将表2参数传递给表1,表1应返回column1但它应该与Null值匹配,如下面的场景

如果我将(0,15)传递给表1,那么它应该返回' C'不是' B'。

如果我通过(0,12)到表1那么它应该返回' A'

任何时候它都应该返回一个值而不是多个值。

你能帮我解释一下这个逻辑吗?

4 个答案:

答案 0 :(得分:0)

你可以做这个联盟:

select Column1 from
(
select Table1.Column1 as Column1,Table1.Column2 as Column2
from Table1
join Table2 on
  Table1.Column2=Table2.Column2 and Table1.Column3=Table2.Column3
UNION
select Table1.Column1 as Column1,Table1.Column2 as Column2
from Table1
join Table2 on
  Table1.Column2 is NULL and Table1.Column3=Table2.Column3
) as Unioned
ORDER BY Column2 NULLS LAST
LIMIT 1;

UNION会丢弃重复项,但如果您明确需要告诉它最多返回一个值,则可以将整个语句包装在另一个SELECT中。

答案 1 :(得分:0)

select *
from table2 t
     left outer join table1 t1 on t.column2=t1.column2 and t.column3=t1.column3
     left outer join table1 t2 on t2.column2 is null and t.column3=t2.column3
where t1.column2 is not null or t2.column3 is not null

答案 2 :(得分:0)

SQL Server

WITH T1
    as
    (SELECT COLUMN1,COLUMN2,
            case when COLUMN2 is null then 0 else COLUMN2 end AS TRANSFORMED_COLUMN2,
            row_number() OVER (partition by isnull(column3,2) ORDER BY isnull(COLUMN2,2) asc) AS rnk,
            COLUMN3 
    FROM    TABLE1)
    SELECT

          T1.COLUMN1,
          T2.COLUMN2,
          T2.COLUMN3
    FROM
    T1
    INNER JOIN
    (SELECT COLUMN2,COLUMN3 FROM TABLE2) T2
    ON T1.TRANSFORMED_COLUMN2 = T2.COLUMN2
       AND T1.COLUMN3=T2.COLUMN3
    where T1.rnk=1

通过使用CTE,您将只运行一次表。

答案 3 :(得分:0)

SELECT t1.* FROM table1 t1
INNER JOIN table2 t2
ON NVL(t1.column2,0) = t2.column2 and t1.column3 = t2.column3