查询之间的SQL与小范围错误

时间:2015-12-14 20:26:12

标签: sql sql-server

我有两个表,Table ATable B

Table A包含

+----+------+------+-------+-------+
| HW | Year |  Sec | From  |  To   |
+----+------+------+-------+-------+
|  1 | 2012 |   40 | 15.04 | 19.07 |
|  1 | 2012 |   40 | 19.07 | 19.14 |
|  2 | 2012 |   40 | 0     | 1.81  |
+----+------+------+-------+-------+

Table B包含

+------+------+-------+-------+------+
| Year |  Sec | From  |  To   | Rate |
+------+------+-------+-------+------+
| 2012 |   40 | 0     | 9.93  |   70 |
| 2012 |   40 | 14.4  | 14.47 |   60 |
| 2012 |   40 | 14.47 | 19.14 |   55 |
+------+------+-------+-------+------+

我的工作是在两个表格中匹配yearsec,并使用Table A

中的新列rate更新Table B

以下是查询:

SELECT DISTINCT A.[Year]
    , A.[Sec]
    , A.[From]
    , B.[From]
    , A.[To]
    , B.[To]
    , B.[Rate]
FROM TABLE A
JOIN TABLE B ON A.Sec = B.SEC
    AND A.Year = B.YEAR
WHERE ((A.FROM >= [B.From] AND A.To <= [B.To]))
    AND A.Year = '2012'
    AND A.control_section = '40'

我得到以下结果:

+------+------+--------+--------+-------+-------+------+
| Year |  Sec | A.From | B.From |  A.To | B.To  | Rate |
+------+------+--------+--------+-------+-------+------+
| 2012 |   40 | 15.04  | 0      | 19.07 | 9.93  |   70 |
| 2012 |   40 | 15.04  | 14.47  | 19.07 | 19.14 |   55 |
| 2012 |   40 | 19.07  | 0      | 19.14 | 9.93  |   70 |
| 2012 |   40 | 19.07  | 14.47  | 19.14 | 19.14 |   55 |
| 2012 |   40 | 0      | 0      | 1.81  | 9.93  |   70 |
+------+------+--------+--------+-------+-------+------+

所需的输出应如下:

+------+------+--------+--------+-------+-------+------+
| Year |  Sec | A.From | B.From | A.To  | B.To  | Rate |
+------+------+--------+--------+-------+-------+------+
| 2012 |   40 | 15.04  | 14.47  | 19.07 | 19.14 |   55 |
| 2012 |   40 | 19.07  | 14.47  | 19.14 | 19.14 |   55 |
| 2012 |   40 | 0      | 0      | 1.81  | 9.93  |   70 |
+------+------+--------+--------+-------+-------+------+

为什么我还要获得另外两行?

1 个答案:

答案 0 :(得分:0)

您得到的结果是错误的,因为您可能没有为列FromTo使用数字数据类型。见:

 SELECT '19.07' <= '9.93' ## Returns 1 (true);
 SELECT 19.07 <= 9.93     ## Returns 0 (false);

因此,查询中的所有FromTo比较可能都是错误的,这就是您获得意外结果的原因。

例如,通过使用适当的数据类型DECIMAL(6,2),您的查询将返回预期的结果。请参阅此Fiddle