【问题标题】:SQL query between two values in a table表中两个值之间的 SQL 查询
【发布时间】:2015-02-20 19:35:26
【问题描述】:

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

因此,SQL 查询将类似于

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  

感谢您的帮助!

【问题讨论】:

  • 你能告诉我你的临时表的数据和预期的输出吗?
  • 我尝试上传图片,但我没有足够的声望点。有什么建议么?谢谢
  • 哦,我的...请以适当的格式将这些内容编辑到原始帖子中,最好插入到子句中。
  • 另外,这是 MySQL 还是 SQL Server?
  • 谢谢 JamesZ 我如何插入子句?它是 SQL Server。

标签: sql-server


【解决方案1】:
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`) 

【讨论】:

  • 谢谢火箭!问题在于代码是文本,因此在范围内有“*”的地方不会返回任何内容
  • 我刚刚重新整理了你的答案,现在正在分析
  • 非常感谢 Rocket 的帮助,请问你是怎么做到的,这样我就知道未来了!再次感谢!
  • 你用的是PHP+MySQL吗?
  • 我正在使用 MS SQL Server Mgnt Studio (SQL Query) 这能回答你的问题吗?
【解决方案2】:

我稍微更改了您的数据 (* -> 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
    ) 

您在使用 时遇到了一些问题,并且缺少对 * (=now NULL) 的检查。这也错过了最后一个条件(code4incfrom / code4incto),但这不在您的 SQL 中。

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

【讨论】:

  • 谢谢!会试一试干杯
  • 收到错误“将 varchar 值 '*' 转换为数据类型 int 时转换失败。”
  • 就像我说的那样,我更改了您的数据,以便它不会将数字存储为文本,因为这可能会导致大于/小于比较的意外问题。如果你真的想要我不推荐的 *,请将 is NULL 替换为 = '*' 并将 convert int 添加到列中
  • 并且通过将 * 更改为 NULL,它也将与下一列相同,它们具有 NULL 而不是 *
  • 感谢 JamesZ 在我的 qry 中尝试各种事情
【解决方案3】:

试试这个查询

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';

【讨论】:

    【解决方案4】:

    重用 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'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-05
      • 1970-01-01
      • 1970-01-01
      • 2010-12-08
      • 2015-08-17
      • 1970-01-01
      相关资源
      最近更新 更多