Sql server 如何获取包含公司(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

重要的。。。在我的RL项目中,ID不是INT,而是GUID,因此我的数据没有层次结构

我有一张公司表和一张公司间链接表

我需要能够从特定的公司ID检索公司列表

这是我的测试代码

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