Sql server 在SQL Server 2012中,如何在特定条件下对表进行内部联接?

Sql server 在SQL Server 2012中,如何在特定条件下对表进行内部联接?,sql-server,Sql Server,我希望在SELECT语句中执行一系列连接。但是,我只希望在满足特定条件的情况下执行最终连接和内部连接。 查询通过将逗号分隔的字符串分隔成一个单词表来创建CTE。为了过滤结果,我加入了这个CTE的另一个表。但是,如果用户没有输入任何字符串,我就不想加入这个表。有没有办法对内部联接设置一些条件 SELECT dt.Document_ID, dt.Document_NAME, c.Company_ID, c.Company_NAME, ct.Category_I

我希望在SELECT语句中执行一系列连接。但是,我只希望在满足特定条件的情况下执行最终连接和内部连接。 查询通过将逗号分隔的字符串分隔成一个单词表来创建CTE。为了过滤结果,我加入了这个CTE的另一个表。但是,如果用户没有输入任何字符串,我就不想加入这个表。有没有办法对内部联接设置一些条件

SELECT  dt.Document_ID, 
    dt.Document_NAME, 
    c.Company_ID,
    c.Company_NAME, 
    ct.Category_ID,
    ct.Category_NAME,
    dt.Employee_ID,
    e.First_NAME AS Employee_First_NAME,
    e.Last_NAME AS Employee_Last_NAME,
    p.Project_ID,
    p.Project_NAME,
    dt.Document_DATE,
    dt.Updated_By_ID,
    u.First_NAME AS Updated_First_NAME,
    u.Last_NAME AS Updated_Last_NAME
FROM Documents_T1 AS dt
    LEFT JOIN Companies_T1 AS c ON c.Company_ID=dt.Company_ID
    LEFT JOIN Categories_T1 AS ct ON ct.Category_ID=dt.Category_ID
    LEFT JOIN Users_T1 AS e ON e.User_ID=dt.Employee_ID
    LEFT JOIN Projects_T1 AS p ON p.Project_ID=dt.Project_ID
    LEFT JOIN Users_T1 AS u ON u.User_ID=dt.Updated_By_ID 
    INNER JOIN TagsCTE AS tcte ON tcte.Document_ID=dt.Document_ID
不,内部联接将被执行,不管它是否在代码中。但是,您可以使用左联接,并在联接条件中包含任何用于确定是否应执行联接的测试

这样做的结果是,如果条件为true,则将基于其余条件执行联接;如果条件为false,则将为这些行中的联接表返回NULL结果

SELECT  dt.Document_ID, 
    dt.Document_NAME, 
    c.Company_ID,
    c.Company_NAME, 
    ct.Category_ID,
    ct.Category_NAME,
    dt.Employee_ID,
    e.First_NAME AS Employee_First_NAME,
    e.Last_NAME AS Employee_Last_NAME,
    p.Project_ID,
    p.Project_NAME,
    dt.Document_DATE,
    dt.Updated_By_ID,
    u.First_NAME AS Updated_First_NAME,
    u.Last_NAME AS Updated_Last_NAME
FROM Documents_T1 AS dt
    LEFT JOIN Companies_T1 AS c ON c.Company_ID=dt.Company_ID
    LEFT JOIN Categories_T1 AS ct ON ct.Category_ID=dt.Category_ID
    LEFT JOIN Users_T1 AS e ON e.User_ID=dt.Employee_ID
    LEFT JOIN Projects_T1 AS p ON p.Project_ID=dt.Project_ID
    LEFT JOIN Users_T1 AS u ON u.User_ID=dt.Updated_By_ID 
    **LEFT** JOIN TagsCTE AS tcte ON tcte.Document_ID=dt.Document_ID AND <<condition>>

实际上你根本不想加入。您希望将此信息放在where子句中

SELECT
    dt.Document_ID, 
    dt.Document_NAME, 
    c.Company_ID,
    c.Company_NAME, 
    ct.Category_ID,
    ct.Category_NAME,
    dt.Employee_ID,
    e.First_NAME AS Employee_First_NAME,
    e.Last_NAME AS Employee_Last_NAME,
    p.Project_ID,
    p.Project_NAME,
    dt.Document_DATE,
    dt.Updated_By_ID,
    u.First_NAME AS Updated_First_NAME,
    u.Last_NAME AS Updated_Last_NAME 
FROM Documents_T1 AS dt
    LEFT JOIN Companies_T1 AS c ON c.Company_ID=dt.Company_ID
    LEFT JOIN Categories_T1 AS ct ON ct.Category_ID=dt.Category_ID
    LEFT JOIN Users_T1 AS e ON e.User_ID=dt.Employee_ID
    LEFT JOIN Projects_T1 AS p ON p.Project_ID=dt.Project_ID
    LEFT JOIN Users_T1 AS u ON u.User_ID=dt.Updated_By_ID  
WHERE
    dt.ID IN (SELECT Document_ID FROM TagsCTE)
    OR
    (SELECT TOP 1 ID FROM TagsCTE) IS NULL
用表D和表T的简单术语

SELECT * FROM D
WHERE
 D.ID IN (SELECT ID FROM T)
 OR (SELECT TOP 1 ID FROM T) IS NULL

我不喜欢语法selecttop1id fromt为NULL,因为它有误导性。如果T没有行,它会成功,但是如果它选择的第一个ID恰好有空值,它也会成功。在这种情况下,可能不可能,但是谁知道呢。。。。如果你使用这种结构,我建议从T=0中选择COUNT1或不存在从T中选择NULL或更清楚的东西。@JoeEnos,在阅读了问题后,我认为TagsCTE表中不会有NULL值。它可能并不漂亮,但由于不能在where子句中有条件地包含表,因此这是最有效的方法。您还可以创建一个存储过程,根据TagsCTE中是否有数据,调用两条SQL语句之一。再说一次,它看起来并不优雅,但它很实用。