我有两个名为tNetworkSocket
和tPatchpanelPorts
的表格,用于过滤数据
我执行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
我得到了数据。
我缺少什么
答案 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中。您应该使用限定符来明确这一点。)