Sql server 如何获取包含公司(ID)的公司列表?
重要的。。。在我的RL项目中,ID不是INT,而是GUID,因此我的数据没有层次结构 我有一张公司表和一张公司间链接表 我需要能够从特定的公司ID检索公司列表 这是我的测试代码Sql server 如何获取包含公司(ID)的公司列表?,sql-server,tsql,recursive-cte,Sql Server,Tsql,Recursive Cte,重要的。。。在我的RL项目中,ID不是INT,而是GUID,因此我的数据没有层次结构 我有一张公司表和一张公司间链接表 我需要能够从特定的公司ID检索公司列表 这是我的测试代码 CREATE TABLE ##corporations ( CorporationID INT NOT NULL, CorporationName NVARCHAR(20) NOT NULL ); CREATE TABLE ##corporationLinks ( FromCor
CREATE TABLE ##corporations
(
CorporationID INT NOT NULL,
CorporationName NVARCHAR(20) NOT NULL
);
CREATE TABLE ##corporationLinks
(
FromCorporationID INT NOT NULL,
ToCorporationID INT NOT NULL
);
INSERT INTO ##corporations (CorporationID, CorporationName) VALUES (1, 'Nike')
INSERT INTO ##corporations (CorporationID, CorporationName) VALUES (2, 'Cocal Cola')
INSERT INTO ##corporations (CorporationID, CorporationName) VALUES (3, 'Apple')
INSERT INTO ##corporations (CorporationID, CorporationName) VALUES (4, 'Google')
INSERT INTO ##corporations (CorporationID, CorporationName) VALUES (5, 'Amazon')
INSERT INTO ##corporations (CorporationID, CorporationName) VALUES (6, 'Samsung')
INSERT INTO ##corporationLinks (FromCorporationID, ToCorporationID) VALUES (1, 2)
INSERT INTO ##corporationLinks (FromCorporationID, ToCorporationID) VALUES (2, 3)
INSERT INTO ##corporationLinks (FromCorporationID, ToCorporationID) VALUES (4, 5)
INSERT INTO ##corporationLinks (FromCorporationID, ToCorporationID) VALUES (4, 6)
SELECT * FROM ##corporationLinks WHERE FromCorporationID = 2 OR ToCorporationID = 2
/**
Organisations (##corporationLinks) are...
Nike + Coca Cola + Apple + Marcy
and...
Google + Amazon + Samsung
**/
-- How do I eg get a list of companies where Coca Cola is in ... that is where FromCorporationID = 2 OR ToCorporationID = 2 ... result should be Nike, Coca Cola and Apple?
-- How do I eg get a list of companies where Samsung is in ... that is where FromCorporationID = 6 OR ToCorporationID = 6 ... result should be Google, Amazon Cola and Samsung?
DROP TABLE ##corporationLinks
DROP TABLE ##corporations
乌德帕特:
如果我需要找到可口可乐参与的公司,那么我会做家禽饲养
从corporationLinks中选择*,其中FromCorporationID=2或ToCorporationID=2
然后我会得到2个结果
FromCorporationID ToCorporationID
-----------------------------------
1 2
2 3
在这里之后,我需要调查一下结果是哪些公司的一部分
SELECT * FROM ##corporationLinks WHERE FromCorporationID = 1 OR ToCorporationID = 1
SELECT * FROM ##corporationLinks WHERE FromCorporationID = 3 OR ToCorporationID = 3
然后我会再得到一个公司7:
FromCorporationID ToCorporationID
-----------------------------------
3 7
然后我需要深入了解哪些公司与7
SELECT * FROM ##corporationLinks WHERE FromCorporationID = 7 OR ToCorporationID = 7
深入研究这个结果,猜测它叫做递归。等等
更新2:
我已经更新了上面的示例,添加了一家公司,如果搜索是可口可乐,则应返回该公司
上述查询的预期结果:
CorporationID:
--------------
2
1
3
7
左键加入公司,包括其CorporationID,或者您可以在查询中包括companyname,然后按CorporationID分组您应该能够通过递归CTE查看它所属的公司: 看。 结果:
只需使用递归CTE
WITH cte
AS
(
SELECT l1.FromCorporationID,l1.ToCorporationID
FROM ##corporationLinks l1
UNION ALL
SELECT cte.FromCorporationID,l3.ToCorporationID
FROM ##corporationLinks l3
JOIN cte
ON cte.ToCorporationID = l3.FromCorporationID
)
SELECT cte.ToCorporationID--parent
FROM cte
WHERE cte.FromCorporationID =2
UNION
SELECT cte.FromCorporationID--child
FROM cte
WHERE cte.ToCorporationID =2
UNION
SELECT c.CorporationID--self
FROM ##corporations c
WHERE c.CorporationID = 2
使用递归CTE查询来查询层次关系。很抱歉不清楚,我已经更新了我的帖子。。。在我的RL项目中,我没有使用INT,而是使用GUID。。。而且它不是层次数据。所以。。。你在问如何编写一个简单的SELECT查询?你期望的表格格式输出是什么?你自相矛盾-你说你的数据不是分层的,与使用GUI无关,顺便说一句,但是你说你需要递归地重复你的查询。我看不出这会起作用,因为如果我搜索可口可乐,如果你只搜索可口可乐,那么所有的搜索结果都会在可口可乐下,Marcy也是如此,如果你想同时看到这两个或全部,那么选择所有公司,而不过滤哪家公司,我希望这就是你的意思。很抱歉,我不够清楚。我不需要搜索公司表。。。我需要搜索corporationLinks以查找与可口可乐等公司有关联的公司。。这将是1,2,3和7。
> | CorporationID |
> | ------------: |
> | 2 |
> | 1 |
> | 3 |
> | 7 |
WITH cte
AS
(
SELECT l1.FromCorporationID,l1.ToCorporationID
FROM ##corporationLinks l1
UNION ALL
SELECT cte.FromCorporationID,l3.ToCorporationID
FROM ##corporationLinks l3
JOIN cte
ON cte.ToCorporationID = l3.FromCorporationID
)
SELECT cte.ToCorporationID--parent
FROM cte
WHERE cte.FromCorporationID =2
UNION
SELECT cte.FromCorporationID--child
FROM cte
WHERE cte.ToCorporationID =2
UNION
SELECT c.CorporationID--self
FROM ##corporations c
WHERE c.CorporationID = 2