SQL Left/Inner/Normal Join vs Where while 条件语句

Posted

技术标签:

【中文标题】SQL Left/Inner/Normal Join vs Where while 条件语句【英文标题】:SQL Left/Inner/Normal Join vs Where while conditional statement 【发布时间】:2016-11-30 15:36:40 【问题描述】:

我对 SQL 编程比较陌生,所以请放轻松。

我目前正在编写一个查询,它将根据来自外部参数之一的值输出结果。该结构目前如下所示:

@ShowEntireCategory bit = 0

select distinct
p.pk
p.name
--other columns
from dbo.Project P
--bunch of left joins
where p.Status = 'Open'
--other conditions

我要实现的是:当 ShowEntireCategory 的值为 1(通过单选按钮选择以编程方式更改)时,它将显示该类别内的所有子类别的记录。为 0 时,仅显示所选子类别中的记录,而该类别中的其他子类别保持不变。

我一直在以最佳方法执行a research,并将narrowed down 用于WHERE 语句或JOINs。

我想知道的是:我应该在我的场景中使用哪些方法?在我的情况下,优先级是优化(最短执行时间)和易于实施。

注意:我在这里的主要目标不是在这里接收现成的代码(尽管欢迎使用示例代码 sn-ps),我只是想知道更好的方法,所以我可以继续朝那个方向研究。

提前谢谢你!

更新

我对数据库结构进行了额外的研究,并设法缩小了与问题相关的参数

一个是dbo.Project表,包含:PK、CategoryKey (FK)(连接到第二个表中的那个)、Name、Description等所有无关的参数。

第二个是dbo.Area表,包含:PK、AreaNumber、Name、CategoryKey(FK)、IsCategory(1=是类别,0=不是类别)。

对不起,我在快节奏的环境中工作,这已经是我能挤出来的了。如果还不够,请告诉我。

【问题讨论】:

这在某种程度上取决于类别和子类别在数据库中的存储方式。 @BrandonM 你能澄清一下吗?我现在能回答的唯一方法是“1 个类别中的 4 个子类别,每个子类别都有自己的标识符”。 你能提供你的表结构和一些示例数据吗?最好是 sql 语句,这样我们就可以设置测试环境 同样在您显示的代码中,没有提到任何关于类别或子类别的内容,所以问题本身并不是很清楚 @Philipp 现在我重新阅读它,似乎是这样。现在编辑我的帖子。 【参考方案1】:

根据您提供的信息,最好的解决方案是结合使用 WHERE 子句和 JOINS。您可能需要在第二个表上使用 WHERE 子句(在更新中描述)来选择所有属于类别的行。然后,您可以将此结果与其他表/数据一起加入。最后,您可以使用 CASE 子句(详见 here)来检查您的变量并确定您需要所有类别还是只需要一些类别(可以通过附加的 WHERE 子句处理)。

不确定这是否完全回答了您的问题,但要获得更详细的答案,我们需要对数据库架构进行更详细的描述。

【讨论】:

抱歉,如果不够详细。但我会接受你的回答并进行更多研究。

以上是关于SQL Left/Inner/Normal Join vs Where while 条件语句的主要内容,如果未能解决你的问题,请参考以下文章

Joi 嵌套模式

有没有办法合并 Joi 模式?

Joi 验证多个条件

如何扩展 Joi 模式?

Joi验证忽略嵌套键

关于EGG项目添加Joi参数校验解决方案