【问题标题】:SQL Query Inner Join with statement?SQL Query Inner Join with 语句?
【发布时间】:2014-03-31 20:21:41
【问题描述】:

刚刚添加了一个带有 cmets 的 SQLFiddle 示例:http://sqlfiddle.com/#!3/d1cce

我正在尝试归档以获取查询中最主要的类别(Category.CategoryId = NULL

项目表:

  • 1 |标题 | 2
  • 1 |标题2 | 3

类别表:

  • 1 |主类示例 |空
  • 2 |子类别示例 | 1
  • 3 |子类别示例 | 2

结果必须是:

  • 1 |标题 |主类别示例
  • 2 |标题2 |主类别示例

点赞:

select item.id, item.title (MAIN category where CategoryId = NULL) 
from .....

如您所见,我可以将Item.CategoryId 设置为SUBSUB 类别或SUB 类别。

但是每次我想要主要类别作为我的查询的结果

我怎样才能做到这一点?

再举一个例子让自己更清楚:

  • 1-项目 1-主要 2

表格:

create table Item
(
    Id INT IDENTITY(1,1) NOT NULL,
    CategoryId INT NOT NULL,
    Title VARCHAR(80) NOT NULL,
    PRIMARY KEY (id)
)
insert into Itemvalues('Item 1', 5)

create table Category
(
    Id INT IDENTITY(1,1) NOT NULL,
    Title VARCHAR(10) NOT NULL,
    CategoryId INT,
    PRIMARY KEY (id)
)
insert into Category values('Main item 1', NULL)
insert into Category values('Sub item under Main item 1', 1)
insert into Category values('Main 2', NULL)
insert into Category values(Sub item under 2', 2)
insert into Category values('Subsub item under subitem 2', 4)

【问题讨论】:

  • 我不明白你的问题!
  • 我不确定你到底想要什么?
  • kkkk!! thx @Mack(我想他想要一个自我加入)
  • 是的,自联接是我认为我需要在类别表中自联接,直到它成为主要类别

标签: sql sql-server inner-join self-join


【解决方案1】:

这对于非常适合分层数据结构的通用表表达式来说是一项很好的工作。

;with cte as
(
  select Id as ItemId, Title as ItemTitle, CategoryId, 0 as Level
  from Item 

  union all

  select cte.ItemId, cte.ItemTitle, c.CategoryId, cte.Level + 1 as Level
  from Category c
  inner join cte on c.Id = cte.CategoryId
  and c.CategoryId is not null

)

select ItemId, ItemTitle, c.Title as CategoryTitle
from cte
inner join Category c on c.Id = cte.CategoryId
where Level = (select Max(Level) from cte as cte1 where cte1.ItemId = cte.ItemId)

SQL Fiddle demo

【讨论】:

  • 嗨,现在我们更进一步了。我唯一需要的是:项目表:1 |标题 | 2 1 |标题2 | 3 类别表:1 |主类示例 |空 2 |子类别示例 | 1 3 |子类别示例 | 2 结果必须是:1 |标题 |主类示例 2 |标题2 |主类示例
  • 你能把它放到你的问题中吗?在 cmets 中读取太难了。
  • 刚刚做了,这对我来说很难解释,但我正在努力做到最好。对不起我的解释。
猜你喜欢
  • 1970-01-01
  • 2020-10-08
  • 1970-01-01
  • 1970-01-01
  • 2012-01-23
  • 2016-04-28
  • 1970-01-01
  • 1970-01-01
  • 2012-10-02
相关资源
最近更新 更多