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
你需要JOIN
到BranchAddress
第二次得到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
(与预期结果一致) ) 用于演示。
在您的预期输出中,对于 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
我下面有两个表格。
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
你需要JOIN
到BranchAddress
第二次得到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
(与预期结果一致) ) 用于演示。
在您的预期输出中,对于 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