Sql server 列或固定值上的T-SQL联接

Sql server 列或固定值上的T-SQL联接,sql-server,tsql,Sql Server,Tsql,我试图找出T-SQL中的一些基本规则 我在这里试图实现的是,只获取表1中与表2匹配的记录,以及表1中“Valid”列的值为1=true的所有记录。 之前我用两个选择和一个联合来完成这项工作,如下所示: SELECT T1.* FROM Table1 T1 INNER JOIN Table2 T2 ON T1.ID = T2.ID UNION SELECT T1.* FROM Table1 T1 WHERE T1.Valid = 1 但是除了使用多个选择和联合来实现这一点,难道没有其他方法吗?

我试图找出T-SQL中的一些基本规则

我在这里试图实现的是,只获取表1中与表2匹配的记录,以及表1中“Valid”列的值为1=true的所有记录。 之前我用两个选择和一个联合来完成这项工作,如下所示:

SELECT T1.*
FROM Table1 T1
INNER JOIN Table2 T2 ON T1.ID = T2.ID
UNION
SELECT T1.*
FROM Table1 T1
WHERE T1.Valid = 1
但是除了使用多个选择和联合来实现这一点,难道没有其他方法吗? 在摆弄时,我做了下面的代码位,但是只有在表2中只有一个匹配项的情况下才有效,否则它会将记录乘以T2中的匹配数

SELECT T1.*
FROM Table1 T1
INNER JOIN Table2 T2 ON T1.ID = T2.ID
    OR T1.Valid = 1
就绩效而言,实现我的目标的最佳方式是什么

另外,请不要保留评论、可能的缺陷或解释其他解决方案可能更好的方式和原因。

假设T1.ID和T2.ID是唯一的或主键:

如果存在重复项,您可能需要写入选择DISTINCT T1.*。原始值中的UNION运算符仅选择不同的值

这一个应该做到:

SELECT T1.*
FROM Table1 T1
WHERE T1.ID IN ( SELECT T2.ID FROM Table2 T2 WHERE T2.ID IS NOT NULL)
   OR T1.Valid = 1


但我认为,最终的执行计划是一样的

or T1.Valid=1在我看来有点奇怪,我会在T1.Id=T2.Id上做内部联接Table2 T2,然后在下一行我会把T1.Valid=1放在哪里,因为你实际上不需要表2中的任何记录,我倾向于将联接更改为EXISTS-选择T1.*从Table1 T1其中T1.Valid=1或EXISTS从Table2 T2中选择1,其中T1.Id=T2.Id;我认为执行计划是相同的,但我认为这更清楚地显示了意图。使用“WHERE T1.Valid=1”将不会返回任何记录,由于我使用的是内部联接guidog,如果表1中的Id在表2中存在多行,那么执行计划和结果可能都不相等?@larsts in将不关心是否存在重复。如果T1中的行不是不同的,则第一个结果将不同;如果T2不是唯一的,则第二个结果将引入重复行使用左连接并忽略T2.ID为Null的条目是一个好的、可以理解的解决方案!谢谢:
SELECT T1.*
FROM Table1 T1
LEFT JOIN Table2 T2 ON T1.ID = T2.ID
WHERE T2.ID IS NOT NULL OR T1.Valid = 1