表中两个值之间的SQL查询

时间:2015-02-20 08:44:11

标签: sql-server

我有2张桌子。我正在尝试选择与第二个表中的条件匹配的值。我不确定JOINS以及如何在Tbl2.code3excfrom和Tbl2.code3excto之间“排除”范围内的代码

因此,SQL Query将类似于

SELECT Tbl2.code, Tbl1.compcode, Tbl1.value  
FROM Tbl1 CROSS JOIN Tbl2  
WHERE Tbl1.compcode = 'ABC1' AND (Tbl2.code2incfrom >= Tbl1.code2 AND
Tbl1.code2 <= Tbl2.code2incto) AND (Tbl2.code3incfrom >= Tbl1.code3 AND
Tbl1.code3 <= Tbl2.code3incto) AND NOT (Tbl2.code3excfrom >= Tbl1.code3
AND Tbl1.code3 <= Tbl2.code3excto) 

TBL1

compcode    code1   code2   code3   code4   value  
-------------------------------------------------
ABC1        CAD     110     11018   FA1199  £3,128.16  
ABC1        CAD     115     11518   BABOA1  £92.00  
ABC1        CAD     230     23010   ZX123   £150.00  
ABC1        CAD     400     40100   CA45    £456.00  
ABC1        CAD     600     60018   DA1199  £1,548.00

TBL2

code    compincfrom compincto   code2incfrom    code2incto  code3incfrom    code3incto  code3excfrom    code3excto  code4incfrom    code4incto  
-------------------------------------------------------------------------
LINE_01     AA      EZ99999     110             110             *           *           NULL            NULL            *           *  
LINE_02     AA      EZ99999     115             115             11500       11519       NULL            NULL            BA          ZZZZZZZZZ  
LINE_03     AA      EZ99999     230             230             23000       23099       23010           23015           *           *  
LINE_04     AA      EZ99999     400             400             40000       40100       NULL            NULL            BA          ZZZZZZZZZ  
LINE_05     AA      EZ99999     600             600             *           *           60102           60103           BA          ZZZZZZZZZ

结果

code    compcode    value  
--------------------------------
LINE_01     ABC1    £3,128.16  
LINE_02     ABC1    £92.00  
LINE_04     ABC1    £456.00  
LINE_05     ABC1    £1,548.00  

感谢您的帮助!

4 个答案:

答案 0 :(得分:0)

SELECT T2.`code`, T1.`compcode`, T1.`value`  
FROM table1Name T1 CROSS JOIN table2Name T2
ON T1.`compcode` = 'ABC1' 
AND (T2.`code2incfrom` >= T1.`code2` AND T1.`code2` <= T2.`code2incto`)
AND (T2.`code3incfrom` >= T1.`code3` AND T1.`code3` <= T2.`code3incto`)
AND NOT (T2.`code3excfrom` >= T1.`code3` AND T1.`code3` <= T2.`code3excto`) 

答案 1 :(得分:0)

我稍微改变了你的数据(* - &gt; NULL),这样数据类型可以是int而不是varchar,但这应该有效:

SELECT
    Tbl2.code, 
    Tbl1.compcode, 
    Tbl1.value
FROM 
    Tbl1 
    CROSS JOIN Tbl2  
WHERE 
    Tbl1.compcode = 'ABC1' AND 
    Tbl2.code2incfrom <= Tbl1.code2 AND 
    Tbl1.code2 <= Tbl2.code2incto AND 
    case when Tbl2.code3incfrom is NULL then -1 else Tbl2.code3incfrom end 
        <= Tbl1.code3 AND 
    Tbl1.code3 <= 
        case when Tbl2.code3incto is NULL then 99999 else Tbl2.code3incto end AND
    NOT (
        case when Tbl2.code3excfrom is NULL then 99999 else Tbl2.code3excfrom end <= 
            Tbl1.code3 AND
        Tbl1.code3 <= 
            case when Tbl2.code3excto is NULL then -1 else Tbl2.code3excto end
    ) 

你有一些与&lt; vs&gt;并且缺少对*(=现在为NULL)的检查。这也错过了最后的标准(code4incfrom / code4incto),但这不在你的SQL中。

SQL小提琴:http://sqlfiddle.com/#!3/b3bed/5

答案 2 :(得分:0)

尝试此查询

SELECT * FROM  (
SELECT 
  Tbl2.code,
  Tbl1.compcode,
  Tbl1.value 
FROM  Tbl1 CROSS JOIN Tbl2  ON  Tbl1.compcode = 'ABC1' AND (Tbl1.code2 <= Tbl2.code2incfrom AND Tbl1.code2 <= Tbl2.code2incto )
 AND (Tbl1.code3 <= Tbl2.code3incfrom AND Tbl1.code3 <= Tbl2.code3incto )
 AND NOT (Tbl1.code3 <= Tbl2.code3excfrom   AND Tbl1.code3 <= Tbl2.code3excto )

 ) temp WHERE temp.compcode='ABC1';

答案 3 :(得分:0)

重复使用jamesZ sql fiddle

WITH fltr AS (
   SELECT code
       , code2incfrom = CASE WHEN code2incfrom='*' THEN -1    ELSE code2incfrom END
       , code2incto   = CASE WHEN code2incto  ='*' THEN 99999 ELSE code2incto END
       , code3incfrom = CASE WHEN code3incfrom='*' THEN -1    ELSE code3incfrom END
       , code3incto   = CASE WHEN code3incto  ='*' THEN 99999 ELSE code3incto END
   FROM tbl2   
)

SELECT Tbl1.*, fltr.*
FROM Tbl1 
LEFT JOIN fltr 
  ON  tbl1.code2 BETWEEN fltr.code2incfrom AND code2incTo 
  AND tbl1.code3 BETWEEN fltr.code3incfrom AND code3incTo
WHERE tbl1.compcode = 'ABC1'