SQL - 查询连接结果为空,即使其中一个表中有数据

时间:2016-09-22 13:58:40

标签: sql sql-server

我有两个名为tNetworkSockettPatchpanelPorts的表格,用于过滤数据 我执行SELECT * FROM tPatchpanelPorts时有数据,但SELECT * FROM tNetworkSocket时没有数据。这是正确的 如果我执行

SELECT Distinct HostID, HostName, HostTypeID, DomainName 
FROM tHosts, tDomains, tPatchpanelPorts, tNetworkSocketPort 
WHERE tHosts.DomainID=tDomains.DomainID 
AND ( tPatchpanelPorts.ConnectedHostID = tHosts.HostID OR tNetworkSocketPort.ConnectedHostID = tHosts.HostID) And AccountID=1

我没有数据,但如果我从查询中删除tNetworkSocketPort,它看起来像:

SELECT Distinct HostID, HostName, HostTypeID, DomainName 
FROM tHosts, tDomains, tPatchpanelPorts 
WHERE tHosts.DomainID=tDomains.DomainID 
AND ( tPatchpanelPorts.ConnectedHostID = tHosts.HostID) And AccountID=1

我得到了数据。

我缺少什么

3 个答案:

答案 0 :(得分:1)

使用显式JOIN语法重新编写查询,对于表I我使用了LEFT JOIN,这可能对您有所帮助

TextViews, ImageViews, Edittext....

答案 1 :(得分:1)

尝试使用几个连接:

SELECT Distinct HostID, HostName, HostTypeID, DomainName 
FROM tHosts 
INNER JOIN tDomains
ON tHosts.DomainID=tDomains.DomainID
LEFT JOIN tPatchpanelPorts
ON tPatchpanelPorts.ConnectedHostID = tHosts.HostID
LEFT JOIN tNetworkSocketPort 
ON tNetworkSocketPort.ConnectedHostID = tHosts.HostID 
WHERE AccountID=1

答案 2 :(得分:1)

您使用的过时逗号分隔联接非常难以阅读。您的查询转换为:

SELECT Distinct HostID, HostName, HostTypeID, DomainName 
FROM tPatchpanelPorts pp
CROSS JOIN tNetworkSocketPort nsp
JOIN tHosts h ON h.HostID IN (pp.ConnectedHostID, nsp.ConnectedHostID)
JOIN tDomains d on d.DomainID = h.DomainID 
WHERE AccountID = 1;

您交叉加入tPatchpanelPorts和tNetworkSocketPort以获得所有可能的组合。由于其中一个表是空的,因此没有可能的组合。然后将其他表连接到此空结果集,当然,该结果集仍为空。

此外,DISTINCT通常是编写错误查询的标志。实际上,当您只想要其中两个表的数据时,您将加入四个表。其他表属于WHERE子句。

我认为你想要这个:

SELECT h.HostID, h.HostName, h.HostTypeID, d.DomainName 
FROM tHosts h 
JOIN tDomains d ON d.DomainID = h.DomainID 
WHERE AccountID = 1
AND
( 
  h.HostID IN (SELECT ConnectedHostID FROM tPatchpanelPorts)
  OR
  h.HostID IN (SELECT ConnectedHostID FROM tNetworkSocketPort)
);

(我认为AccountID位于tHosts或tDomains中。您应该使用限定符来明确这一点。)