1

我目前有 2 张桌子:

CrawlData
id (autoincrement), Source, Destination, and some more columns

Nodes
id (autoincrement), URL

Nodes表包含来自CrawlData的不同 Source 值

现在我想要一个表,它是一种查找表,其中包含来自节点的 ID,而不是来自CrawlData的 Source 和 Destination 中的文本

我可以在 URL=Source 和 URL=Destination 上使用 Join 来获取所有 ID,但不知道如何将它们组合起来,然后将它们放入具有 2 列的新表Edges中:

  • SourceNode(= 来自 CrawlData.Source = URL 的节点的 ID)
  • DestinationNode(= 来自 CrawlData.Destination = URL 的节点的 ID)
4

2 回答 2

2

您可以使用语句语句INSERT返回的记录。SELECTINSERT INTO...SELECT

INSERT INTO Edges(SourceNode, DestinationNode)
SELECT  b.ID SourceNode,
        c.ID DestinationNode
FROM    CrawlData a
        INNER JOIN Nodes b
            ON a.Source = b.URL
        INNER JOIN Nodes c
            ON a.Destination = c.URL

要进一步了解有关联接的更多信息,请访问以下链接:

为了更快地执行,请执行以下语句以添加INDEX列以避免FULL TABLE SCAN在大型 RDBMS 上执行时可能会很慢。

ALTER TABLE Nodes ADD INDEX (URL);

如果 和 的所有值SourceDestination出现在 上Nodes.URL,则将这些列声明为外键,

ALTER TABLE CrawlData 
      ADD CONSTRAINT cd_fk1 FOREIGN KEY (Source) REFERENCES Nodes(URL)
ALTER TABLE CrawlData 
      ADD CONSTRAINT cd_fk2 FOREIGN KEY (Destination) REFERENCES Nodes(URL)

否则,在它们上添加普通索引

ALTER TABLE CrawlData ADD INDEX (Source);
ALTER TABLE CrawlData ADD INDEX (Destination);
于 2013-03-28T14:00:04.643 回答
1

您可以两次加入节点表。一次,使用 Source 加入 URLK。下次使用目的地。

从概念上讲,这就像使用节点表的两个副本,每个副本都有不同的名称(例如“S”和“D”)。你得到:

select S.ID As SOURCE_ID, D.ID As DEST_ID
from CrawlData
join Nodes S on Source = S.URL
join Nodes D on Destination = D.URL
于 2013-03-28T14:00:43.103 回答