加入不具有相同值的键

时间:2015-06-15 03:26:49

标签: mysql sql join

我正在尝试对两个具有相似值的表进行INNER JOIN,但不完全相同。一个表的主键具有完全限定的主机名,另一个表具有主机短名称以及子域。可以安全地假设短名称和子域一起是唯一的。

所以我试过了:

SELECT table1.nisinfo.* FROM table1.nisinfo INNER JOIN table2.hosts ON (table1.nisinfo.shortname + '.' + table1.nisinfo.subdomainname + '.domain.com') = table2.hosts.fqhn WHERE table2.hosts.package = 'somepkg'; 

这并不会返回我期望的结果,它会返回第一个结果数百次。我想要返回不同的行。运行也需要很长时间。

我做错了什么?我正在考虑运行一个子查询来获取主机名,但我不知道这里的正确路径是什么。

谢谢!

3 个答案:

答案 0 :(得分:0)

您可以在查询中使用group by,这样您就可以获得所需的结果 请看这两个链接

Group by with 2 distinct columns in SQL Server

http://www.sqlteam.com/article/how-to-use-group-by-with-distinct-aggregates-and-derived-tables

答案 1 :(得分:0)

尝试将结果放入临时表中,然后查看表以确保列符合预期。

SELECT table1.nisinfo.*, table1.nisinfo.shortname + '.' + table1.nisinfo.subdomainname + '.domain.com' AS ColID
INTO #temp
FROM table1.nisinfo;

Select * 
from #temp INNER JOIN table2.hosts ON @#temp.ColID = table2.hosts.fqhn 
WHERE table2.hosts.package = 'somepkg'
;

在第二个陈述的末尾加上一个Group By子句

答案 2 :(得分:0)

所以在这种情况下,我使用子查询来获取初始结果,然后使用连接。

SELECT table1.nisinfo.* FROM table1.nisinfo JOIN (SELECT distinct(fqhn) FROM table2.hosts WHERE package = 'bash') AS FQ ON ((SUBSTRING_INDEX(FQ.fqhn, '.', 1)) = table1.nisinfo.shortname);