我有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
感谢您的帮助!
答案 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中。
答案 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'