如何在 SQL 中定义 INNER JOIN
How to define INNER JOIN in SQL
我在如何在 SQL 中定义 INNER JOIN 时遇到问题。问题是我有一个包含 ID
和 Name
列的 table Names
。另一个 table 有列 PersonID
.
有时 PersonID
列中的值为 0,而 Names
table 中没有列值为 0 的行。
我创建了一个视图,我正在使用 INNER JOIN
。问题是视图中的 SELECT
语句仅在列 PersonID
.
中的值大于零时才有效
当值为 0 时如何定义 INNER JOIN
,以便该列为 NULL,当不为零时,值应为 Name
来自 Names
?
我的意思是:
CREATE OR ALTER VIEW dbo.Test
AS
SELECT
a.Column1,
a.Column2,
...,
CASE
WHEN a.PersonID IS NULL
THEN ''
ELSE b.Name
END AS PersonName
FROM
dbo.ExampleA AS a
INNER JOIN
-- What to put in here that value is NULL when PersonID = 0,
-- and when PersonID > 0 then join value should be a.PersonID = b.ID?
dbo.Names AS b ON ???
提前感谢您的帮助。
听起来你想要LEFT JOIN
:
SELECT e.Colum1, e.Colum2, . . . ,
COALESCE(e.name, n.Name) AS PersonName
FROM dbo.ExampleA e LEFT JOIN
dbo.Names n
ON n.personid = e.personid;
请注意,这也会将 table 别名更改为 有意义的 table 缩写。并使用 COALESCE()
而不是 CASE
.
您应该改用 LEFT JOIN。即:
CREATE OR ALTER VIEW dbo.Test
AS
SELECT a.Colum1,
a.Colum2,
...,
Coalesce(b.Name,'') AS PersonName
FROM dbo.ExampleA AS a
LEFT JOIN dbo.Names AS b
ON a.PersonId = b.Id;
使用 union all 的替代方法..
CREATE OR ALTER VIEW dbo.Test
AS
SELECT
a.Column1,
a.Column2,
...,
b.Name as PersonName
FROM dbo.SomeTableName AS a
INNER JOIN Names on A.PERSONID = B.ID
UNION ALL
SELECT
a.Column1,
a.Column2,
...,
'' as PersonName
FROM dbo.SomeTableName as A
WHERE A.PersonID = 0
我在如何在 SQL 中定义 INNER JOIN 时遇到问题。问题是我有一个包含 ID
和 Name
列的 table Names
。另一个 table 有列 PersonID
.
有时 PersonID
列中的值为 0,而 Names
table 中没有列值为 0 的行。
我创建了一个视图,我正在使用 INNER JOIN
。问题是视图中的 SELECT
语句仅在列 PersonID
.
当值为 0 时如何定义 INNER JOIN
,以便该列为 NULL,当不为零时,值应为 Name
来自 Names
?
我的意思是:
CREATE OR ALTER VIEW dbo.Test
AS
SELECT
a.Column1,
a.Column2,
...,
CASE
WHEN a.PersonID IS NULL
THEN ''
ELSE b.Name
END AS PersonName
FROM
dbo.ExampleA AS a
INNER JOIN
-- What to put in here that value is NULL when PersonID = 0,
-- and when PersonID > 0 then join value should be a.PersonID = b.ID?
dbo.Names AS b ON ???
提前感谢您的帮助。
听起来你想要LEFT JOIN
:
SELECT e.Colum1, e.Colum2, . . . ,
COALESCE(e.name, n.Name) AS PersonName
FROM dbo.ExampleA e LEFT JOIN
dbo.Names n
ON n.personid = e.personid;
请注意,这也会将 table 别名更改为 有意义的 table 缩写。并使用 COALESCE()
而不是 CASE
.
您应该改用 LEFT JOIN。即:
CREATE OR ALTER VIEW dbo.Test
AS
SELECT a.Colum1,
a.Colum2,
...,
Coalesce(b.Name,'') AS PersonName
FROM dbo.ExampleA AS a
LEFT JOIN dbo.Names AS b
ON a.PersonId = b.Id;
使用 union all 的替代方法..
CREATE OR ALTER VIEW dbo.Test
AS
SELECT
a.Column1,
a.Column2,
...,
b.Name as PersonName
FROM dbo.SomeTableName AS a
INNER JOIN Names on A.PERSONID = B.ID
UNION ALL
SELECT
a.Column1,
a.Column2,
...,
'' as PersonName
FROM dbo.SomeTableName as A
WHERE A.PersonID = 0