Sql server 在SQL Server 2012中,如何在特定条件下对表进行内部联接?
我希望在SELECT语句中执行一系列连接。但是,我只希望在满足特定条件的情况下执行最终连接和内部连接。 查询通过将逗号分隔的字符串分隔成一个单词表来创建CTE。为了过滤结果,我加入了这个CTE的另一个表。但是,如果用户没有输入任何字符串,我就不想加入这个表。有没有办法对内部联接设置一些条件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 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语句之一。再说一次,它看起来并不优雅,但它很实用。