SQL 当 child 列为 0 时得到 Parent

SQL Get Parent when child is column is 0

我下面有两个表格。

CREATE TABLE Name
(
    Id INT IDENTITY(1,1) PRIMARY KEY,
    Name VARCHAR(256)
)

CREATE TABLE BranchAddress
(
    Id INT IDENTITY(1,1) PRIMARY KEY,
    UserId INT NOT NULL,
    ParentId INT NOT NULL,
    IsNetwork BIT,
    Address VARCHAR(256)
)

数据:

INSERT INTO dbo.Name ( Name )
VALUES ('George'), ('Greg')

INSERT INTO BranchAddress (UserId, ParentId, IsNetwork, Address)
VALUES (1, 0, 1, 'Kings Street'), (1, 1, 0, 'GS Road'),
       (1, 0, 0, 'Nariman Point'), (1, 1, 1, 'St. College Street'),
       (1, 2, 1, 'PG National Road'), (1, 1, 0, 'LOS India')

使用连接我从两个表中获得了所需的信息,但在新情况下我需要提取 Address 就像 IsNetwork = 0 那么地址应该是 parent

以下是join

的查询
SELECT 
    t.Id, t.Name, t2.ParentId, t2.IsNetwork, t2.Address 
FROM 
    dbo.Name t 
INNER JOIN 
    BranchAddress t2 ON t.Id = t2.UserId 

这是该查询的输出:

Id          Name    ParentId IsNetwork    Address
----------- ------- ----------- --------- -------------------------
1           George  0           1         Kings Street
1           George  1           0         GS Road
1           George  0           0         Nariman Point
1           George  1           1         St.College Street
1           George  2           1         PG National Road
1           George  1           0         LOS India

我想要如下输出。

Id          Name    ParentId IsNetwork    Address
----------- ------- ----------- --------- -------------------------
1           George  0           1         Kings Street
1           George  1           0         Kings Street
1           George  0           0         Kings Street
1           George  1           1         St.College Street
1           George  2           1         PG National Road
1           George  1           0         Kings Street

运行 SELECT * FROM [Name] 第一

SELECT t.Id,t.Name,t2.ParentId,t2.IsNetwork,t2.Address 
FROM [Name] t LEFT OUTER JOIN BranchAddress t2 ON t.Id = t2.UserId 

你需要JOINBranchAddress第二次得到parent的Address,然后select根据哪个地址到return原始行的 IsNetwork 值:

SELECT n.Id, n.Name, b1.ParentId, b1.IsNetwork, 
       CASE WHEN b1.IsNetwork = 0 THEN b2.Address
            ELSE b1.Address
       END AS Address
FROM Name n
INNER JOIN BranchAddress b1 ON n.Id = b1.UserId
LEFT JOIN BranchAddress b2 ON b2.ID = b1.ParentId

输出

Id  Name    ParentId    IsNetwork   Address
1   George  0           true        Kings Street
1   George  1           false       Kings Street
1   George  1           false       Kings Street
1   George  1           true        St. College Street
1   George  2           true        PG National Road
1   George  1           false       Kings Street

请注意,Nariman Point 的条目有一个无效的 ParentId (0),我已将其更改为 1(与预期结果一致) ) 用于演示。

Demo on SQLFiddle

在您的预期输出中,对于 Nariman Point 地址,您也想要 Kings street,即使其父级为 0。这是一个错字吗?

SELECT t.Id,t.Name,t2.ParentId,t2.IsNetwork,
     case when t2.isNetWork = 0 and t2.ParentId > 0  then t3.Address else t2.Address end as Address
     FROM [dbo].[Name] t 
     INNER JOIN dbo.BranchAddress t2 ON t.Id = t2.UserId
     left JOIN dbo.BranchAddress t3 on t3.id = t2.ParentId

向作为网络的父零添加一个额外的左连接。
但仅限于非网络地址。

SELECT 
usr.Id, 
usr.Name,
addr1.ParentId, 
addr1.IsNetwork,
COALESCE(addr2.Address, addr1.Address) as Address2
FROM dbo.Name usr
INNER JOIN BranchAddress addr1
  ON addr1.UserId = usr.Id
LEFT JOIN BranchAddress addr2
  ON addr2.UserId = usr.Id
 AND addr2.ParentId = 0
 AND addr2.IsNetwork = 1
 AND addr1.IsNetwork = 0

**你可以试试这个来选择 Parent

Select t.Id,t.Name,t2.ParentId,t2.IsNetwork,case when IsNetwork = 0 then (select Address from BranchAddress where Id in (select min(Id) from BranchAddress)) else t2.Address end 'Address' 
FROM dbo.Name t 
INNER JOIN BranchAddress t2 
ON t.Id = t2.UserId