当列不正确匹配时,SQL 如何从多个表中查询 return 数据
How can an SQL query return data from multiple tables when column don't match properly
我试图找到相关信息,但似乎我自己无法理解这一点,所以我需要帮助:)
例如,Table1 :
+-------+-------------+------+-----------+----------+
| ID | SNA_Name | Desc | Time | Task_ID |
+-------+-------------+------+-----------+----------+
| 741 | Temp | NNE | 2015-01-. | 1661 |
+-------+-------------+------+-----------+----------+
Table 2 :
+-------+-------------+
| ID | Name |
+-------+-------------+
| 741 | GRFDSD14 |
+-------+-------------+
Table 3 :
+-------+-------------+------+-----------+-------------------------+
| xx | USER | xx | xx | Data |
+-------+-------------+------+-----------+-------------------------+
| xx | Mylsef | xx | xx | xxx.dd.1661 azerty |
+-------+-------------+------+-----------+-------------------------+
我想在最后有这样的东西:
(----------TABLE 1----------------------)(--Table 2---)(---TABLE 3---)
+-------+-------------+------+-----------+-------------+-------------+
| ID | SNA_Name | Desc | Time | Name | USER |
+-------+-------------+------+-----------+-------------+-------------+
| 741 | Temp | NNE | 2015-01-.| GRFDSD14 | Mylsef |
+-------+-------------+------+-----------+-------------+-------------+
到目前为止,我已经尝试使用相同的 ID 741
来匹配 TABLE 1 和 2
SELECT a.ID, a.SNA_Name, a.Desc, a.Time, b.Name
FROM Table1 a
INNER JOIN Table2 b
on a.ID = b.ID
结果:
+-------+-------------+------+-----------+-------------+
| ID | SNA_Name | Desc | Time | Name |
+-------+-------------+------+-----------+-------------+
| 741 | Temp | NNE | 2015-01-.| GRFDSD14 |
+-------+-------------+------+-----------+-------------+
但是要加入第三个Table我需要匹配Task_ID信息:1661
第三个Table,我的ID是数字投降,不能用=
我想在数据与 Task_ID
匹配的同一行中打印 Column USER
非常感谢。
[编辑 -> 使用 SQL 2008
试试这个加入:
FROM Table1
JOIN Table3 ON Table3.Data LIKE '%'+ CAST(Table1.Task_ID AS varchar(20)) + '%'
你没有提到你使用的是什么数据库,所以我不能给出具体细节,但我会尝试使用能够比较你描述的任何情况的正则表达式来创建一个计算列,那是...
有时数字前面有句点,有时前面有 space,有时前面有撇号。
在下面的示例中,正则表达式将检查 id 及其前面任何上述字符的任意组合,并且它还会防止部分值不匹配 - 即它不会匹配 56 和 4564。
SELECT
*
FROM
t1
LEFT JOIN
t2
ON
concat(t2.data, ' ') REGEXP concat('[\'. ]', t1.i2, ' ')
关于上面的一些注释 - 我将 space 连接到数据列上,这样我总是可以保证数字后跟 space,或者数字后跟其他一些文本(例如您的 "azerty")。我在 id 的末尾连接了一个 space,这样它就可以防止匹配相同的 id 嵌入到另一个值中。
我希望这对某人有帮助。
我试图找到相关信息,但似乎我自己无法理解这一点,所以我需要帮助:)
例如,Table1 :
+-------+-------------+------+-----------+----------+
| ID | SNA_Name | Desc | Time | Task_ID |
+-------+-------------+------+-----------+----------+
| 741 | Temp | NNE | 2015-01-. | 1661 |
+-------+-------------+------+-----------+----------+
Table 2 :
+-------+-------------+
| ID | Name |
+-------+-------------+
| 741 | GRFDSD14 |
+-------+-------------+
Table 3 :
+-------+-------------+------+-----------+-------------------------+
| xx | USER | xx | xx | Data |
+-------+-------------+------+-----------+-------------------------+
| xx | Mylsef | xx | xx | xxx.dd.1661 azerty |
+-------+-------------+------+-----------+-------------------------+
我想在最后有这样的东西:
(----------TABLE 1----------------------)(--Table 2---)(---TABLE 3---)
+-------+-------------+------+-----------+-------------+-------------+
| ID | SNA_Name | Desc | Time | Name | USER |
+-------+-------------+------+-----------+-------------+-------------+
| 741 | Temp | NNE | 2015-01-.| GRFDSD14 | Mylsef |
+-------+-------------+------+-----------+-------------+-------------+
到目前为止,我已经尝试使用相同的 ID 741
来匹配 TABLE 1 和 2SELECT a.ID, a.SNA_Name, a.Desc, a.Time, b.Name
FROM Table1 a
INNER JOIN Table2 b
on a.ID = b.ID
结果:
+-------+-------------+------+-----------+-------------+
| ID | SNA_Name | Desc | Time | Name |
+-------+-------------+------+-----------+-------------+
| 741 | Temp | NNE | 2015-01-.| GRFDSD14 |
+-------+-------------+------+-----------+-------------+
但是要加入第三个Table我需要匹配Task_ID信息:1661 第三个Table,我的ID是数字投降,不能用= 我想在数据与 Task_ID
匹配的同一行中打印 Column USER非常感谢。
[编辑 -> 使用 SQL 2008
试试这个加入:
FROM Table1
JOIN Table3 ON Table3.Data LIKE '%'+ CAST(Table1.Task_ID AS varchar(20)) + '%'
你没有提到你使用的是什么数据库,所以我不能给出具体细节,但我会尝试使用能够比较你描述的任何情况的正则表达式来创建一个计算列,那是...
有时数字前面有句点,有时前面有 space,有时前面有撇号。
在下面的示例中,正则表达式将检查 id 及其前面任何上述字符的任意组合,并且它还会防止部分值不匹配 - 即它不会匹配 56 和 4564。
SELECT
*
FROM
t1
LEFT JOIN
t2
ON
concat(t2.data, ' ') REGEXP concat('[\'. ]', t1.i2, ' ')
关于上面的一些注释 - 我将 space 连接到数据列上,这样我总是可以保证数字后跟 space,或者数字后跟其他一些文本(例如您的 "azerty")。我在 id 的末尾连接了一个 space,这样它就可以防止匹配相同的 id 嵌入到另一个值中。
我希望这对某人有帮助。