如何在 SQL 中定义 INNER JOIN

How to define INNER JOIN in SQL

我在如何在 SQL 中定义 INNER JOIN 时遇到问题。问题是我有一个包含 IDName 列的 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