0

我有两个表,一个表在每一行中都有一些信息以及另一个表包含的逗号分隔的 id 列表。现在我正在从表 A 中获取数据(使用逗号分隔的 id),并且我还想从表 B(包含附加信息的表)中获取所有数据。我想用最有效的 SQL 方法来做到这一点。

我正在考虑根据字段中的 id 将表 B 加入表 A,但我不确定这是否可能。同样重要的是要注意,我是根据另一个 IN 语句从表 A 中获取数据,所以我的最终目标是将表 B 中的所有行附加到表 A 的行,具体取决于表 A 行中的字段中的哪些 id (逐行计算)

如果有人可以遵循所有这些并知道我要做什么,我将不胜感激示例查询:D

如果您需要任何进一步的说明,我很乐意为您提供。

谢谢

现在设置表 A 的方式:

`table_a_id` VARCHAR ( 6 ) NOT NULL,
`table_b_ids` TEXT NOT NULL, -- This is a comma seperated list at the moment
-- More data here that is irrelevant to this question but i am grabbing

表 B 设置如下:

`table_b_id` VARCHAR ( 6 ) NOT NULL,
`name` VARCHAR ( 128 ) NOT NULL,
-- More data that is not relevant to the question

另外,我想最终切换到像 Cassandra 这样的 NOSQL 系统,从我简要阅读的内容来看,我知道 NOSQL 中没有连接之类的东西?额外的帮助是帮助我设置这些表格,这样我就可以以更少的转换和难度进行转换。

4

2 回答 2

3

您需要添加另一个表。

Person -- your Table A
------
PersonID 

Thing -- your Table B
------
ThingID
ThingName

PersonThing -- new intersection table
-------
PersonID
ThingID

然后你的查询变成

SELECT * from Person
INNER JOIN PersonThing ON Person.PersonID = PersonThing.PersonID
INNER JOIN Thing ON PersonThing.ThingID = Thing.ThingID

所以你现在在哪里

001 | Sam Spade | 12,23,14

你将会拥有

Person
001 | Sam Spade

Thing
12 | box
23 | chair
14 | wheel

PersonThing
001 | 12
001 | 23
001 | 14

这就是“标准化”其他答案的含义。

编辑添加

根据我对 NoSQL 的了解,您可以像这样绕过连接:

Person -- your Table A
------
PersonID
OtherPersonStuff

Thing -- your Table B
------
ThingID
ThingName
OtherThingStuff


PersonThing -- denormalized table, one record for each Thing held by each Person
-------
PersonID
ThingID
ThingName
OtherThingStuff

为了换取占用额外空间(通过多次复制事物信息)和潜在的数据管理难题(保持副本同步),您可以获得更简单、更快的查询。

所以你的最后一张桌子看起来像这样:

PersonThing
001 | 12 | box   | $2.00
001 | 23 | chair | $3.00
001 | 14 | wheel | $1.00
002 | 12 | box   | $2.00
003 | 14 | wheel | $1.00

在这种情况下,OtherThingStuff 是事物的值。

于 2012-08-08T16:57:46.730 回答
2

您应该考虑规范化您的数据库模式以使用连接。使用逗号分隔的列表将不允许您使用任何 SQL IN 命令。

最好的方法是为每个唯一 ID 存储一行,然后你可以加入TableA.id = TableB.id

于 2012-08-08T16:56:12.053 回答