SQL无法识别相等的值

时间:2013-09-17 17:11:13

标签: sql sql-server

更新 我想出了导致我问题的很大一部分原因。当我查询数据库以查找数据类型时,它正确返回了CHAR(4)以获取t2.sale_code。

然而,GUI没有显示前导零。 t3.sale_code在填充表的文件中没有前导零。这就是造成我困惑的原因,我纠正了零问题。现在它加入时没有任何CAST或其他操作。

__ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ ____ _我有一个查询:

SELECT
  t1.id, t2.sale_code, t3.sale_code, t3.title
FROM
  t1
INNER JOIN t2 ON t1.id = t2.id
INNER JOIN t3 ON t3.id = t2.id

我无法控制一些不同的一对多关系会导致重复。我需要这样做:

WHERE
  t2.sale_code = t3.sale_code

然而,这只是行不通。我不确定我做错了什么。我可以手动使它工作:

SELECT
  t1.id, t2.sale_code, t3.sale_code, t3.title
FROM
  t1
INNER JOIN t2 ON t1.id = t2.id
  AND t2.dt > t1.dt_active
  AND t2.dt < t1.dt_inactive
INNER JOIN t3 ON t3.id = t2.id
WHERE
  t2.sale_code = 4
  AND t3.sale_code = 4

例如,这将返回一对正确匹配的sale_code对。但是,当我直接比较它们(`WHERE t2.sale_code = t3.sale_code)时,它不返回任何结果。我在这里做错了吗?

2 个答案:

答案 0 :(得分:2)

如果它们都是字符/字符串类型,那么你应该像

那样引用它们
sale_code = '4'

列中可能有一些数据不可见,但是通过自动转换int到varchar(4)会被截断。

您可以使用DATALENGTH()来确定列是否具有隐藏的字符,或者将值复制到体面的文本编辑器中并查看十六进制视图中的值。

使联接起作用的一种肮脏方式是使用修剪包装sale_code,但最好还是清理数据。

RTRIM(LTRIM(t2.sale_code)) = RTRIM(LTRIM(t3.sale_code))

答案 1 :(得分:0)

您可以添加到内部联接

SELECT
  t1.id, t2.sale_code, t3.sale_code, t3.title
FROM
  t1
INNER JOIN t2 ON t1.id = t2.id
INNER JOIN t3 ON t3.id = t2.id AND t2.sale_code = t3.sale_code