2

我最近在这里问了一个关于 SQL 查询的问题:Trouble wrapping head around complex SQL delete query

我现在明白,我正在尝试做的事情太复杂了,无法通过单个查询甚至多个查询来完成,而没有某种方法可以将结果保持在两者之间。因此我决定创建一个 bash 脚本(最终结果将与 cronjob 有关,因此 bash 是最直接的选择)。

考虑下表:

关联客户:

+-----------+-----------------+
| Client_id | Registration_id |
+-----------+-----------------+
|         2 |               2 | 
|         3 |               2 | 
|         3 |               4 | 
|         4 |               5 | 
|         3 |               6 | 
|         5 |               6 | 
|         3 |               8 | 
|         8 |               9 | 
|         7 |              10 | 
+-----------------------------+

我想要做的是选择特定关联s列表的所有Registration_ids 。Client_idClient_id Registration_id

虽然我对 SQL 很陌生,但我发现这个查询相对容易:

SELECT `Registration_id` FROM `AssociatedClient` ac1
WHERE ac1.`Client_id` IN
                      (SELECT `Client_id` FROM `AssociatedClient` ac2 
                       WHERE ac2.`Registration_id` = $reg_id);

where$reg_id只是一个 bash 变量。

这可行,但我希望看到它通过self join完成,因为它看起来更好,尤其是在出现大量字符混乱的 bash 脚本中。恐怕我的 SQL 技能还达不到那么远。

4

1 回答 1

2

如果我理解正确,您应该能够像这样进行简单的自我加入:

SELECT ac1.registration_id
FROM associatedclient ac1
JOIN associatedclient ac2 ON ac2.client_id = ac1.client_id
WHERE ac2.registration_id = $reg_id

所以你正在做的是扫描一次表,将它加入到 client_id 匹配的自身。然后,您将连接的行限制为表的第二个版本具有特定 id 的行,让您在第一个表上获得不同的连接排列,然后从这些行中选择registration_id。

因此,给定变量值为 6 的示例,请尝试运行以下语句:

SELECT 
  ac1.client_id AS client_id_1
, ac1.registration_id AS reg_id_1
, ac2.client_id AS client_id_2
, ac2.registration_id AS reg_id_2
FROM associatedclient ac1
JOIN associatedclient ac2 ON ac1.client_id = ac2.client_id

你会注意到完整的连接集。然后尝试添加WHERE限制并注意返回哪些行。然后最后只需选择您想要的列。

您可以查看我设置的SQLFiddle ,它使用 6 的值对其进行测试

于 2013-02-27T10:33:56.563 回答