sql - 我需要某种条件连接

标签 sql sql-server sql-server-2008 left-join

好吧,我知道有一些帖子讨论了这个问题,但我的问题不能通过连接上的条件 where 语句(常见解决方案)来解决。

我有三个 join 语句,根据查询参数,我可能需要运行这三个语句的任意组合。我的 Join 语句非常昂贵,因此我只想在查询需要时才进行连接,并且我不准备编写 7 个组合 IF..ELSE.. 语句来实现这些组合.

这是我迄今为止所使用的解决方案,但所有这些都不太理想:

LEFT JOIN joinedTable jt
ON jt.someCol = someCol
WHERE jt.someCol = conditions
OR @neededJoin is null

(这太昂贵了,因为即使我不需要它,我也会执行连接,只是不评估连接)

OUTER APPLY
(SELECT TOP(1) * FROM joinedTable jt 
WHERE jt.someCol = someCol
AND @neededjoin is null)

(这比总是离开加入更昂贵)

SELECT @sql = @sql + ' INNER JOIN joinedTable jt ' +
             ' ON jt.someCol = someCol ' +
             ' WHERE (conditions...) '

(这是 IDEAL,以及它现在的编写方式,但我正在尝试将其从动态 SQL 中转换出来)。

任何想法或帮助都会很棒!

编辑: 如果我采用动态 SQL 方法,我会尝试找出在构建查询方面最有效的方法。鉴于我有三个可选条件,并且我需要所有这些条件的结果,我当前的查询会执行如下操作:

IF condition one
SELECT from db
INNER JOIN condition one

UNION

IF condition two
SELECT from db
INNER JOIN condition two

UNION

IF condition three
SELECT from db
INNER JOIN condition three

我的非动态查询通过执行左连接来完成此任务:

SELECT from db
LEFT JOIN condition one
LEFT JOIN condition two
LEFT JOIN condition three
WHERE condition one is true
OR condition two is true
OR condition three is true

哪一个更有意义?因为“SELECT from db”语句中的所有代码都是相同的?看来联合条件更有效,但我的查询因此非常长......

谢谢!

最佳答案

LEFT JOIN
joinedTable jt ON jt.someCol = someCol AND jt.someCol = conditions AND @neededjoin ...
...

或者

LEFT JOIN
(
SELECT col1, someCol, col2 FROM joinedTable WHERE someCol = conditions AND @neededjoin ...
) jt ON jt.someCol = someCol
...

或者

;WITH jtCTE AS
(SELECT col1, someCol, col2 FROM joinedTable WHERE someCol = conditions AND @neededjoin ...)
SELECT
...
LEFT JOIN
jtCTE ON jtCTE.someCol = someCol
...

说实话,除非使用文字,否则不存在条件 JOIN 这样的构造。

如果它在 SQL 语句中,则会对其进行评估...所以不要使用动态 SQL 或 IF ELSE 将其放在 SQL 语句中

关于sql - 我需要某种条件连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3789964/

相关文章:

sql - 在单个查询中插入 2 个表 postgresql

c# - 将复合键与 Entity Framework Core 结合使用并将其中的一部分用作外键

c# - SQL Server CE错误不允许访问数据库文件

java - 根据架构 2 中表的几列值更新架构 1 中的表

c# - SQL 事务提交使连接处于损坏状态 (c#)

java - 如果 ID 在数据库中可用,则更新,否则插入

sql - 如何根据重复项对表列进行排名?

php - 使用 php 和 sql server 更新表(动态!)

MySQL 基于文本字段连接 2 个表

c# - 在 C# 中使用参数查询(使用 SQL Server)