带有“检查表”的MS SQL select语句

时间:2015-06-15 13:41:59

标签: sql-server tsql

我很难找到我的select语句的解决方案。我有两张桌子:

CREATE TABLE Things
(
  Id int, 
  type int
)

CREATE TABLE Relations
(
  Id int,
  IdParent int,
  IdChild int
)

我需要根据给定的事物ID选择:

  • 来自具有Type = -1
  • 的内容的所有记录
  • Type匹配IdChild匹配IdParent的所有记录,其中Id是给定Type的行匹配类型。
  • 如果匹配给定Id的行-1CREATE TABLE Things (id int, type int) CREATE TABLE Relations (id int, parent int, child int) INSERT INTO Things VALUES (1, 1) INSERT INTO Things VALUES (2, -1) INSERT INTO Things VALUES (3, 3) INSERT INTO Things VALUES (4, 3) INSERT INTO Things VALUES (5, 2) INSERT INTO Things VALUES (6, -1) INSERT INTO Relations VALUES (1, 1, 2) DECLARE @id int = 1 SELECT * FROM Things JOIN Relations R ON R.parent = @id AND Type = R.child OR Type = -1 或表关系中不存在(作为IdParent),我需要选择所有来自事物的记录

我遇到了上一个场景的问题,我尝试通过加入Relations表来做到这一点,但我不能提出满足所有场景,任何建议的条件?

更新

这就是我现在的表现。我需要解决表关系中不存在给定id的情况 - 然后我需要选择所有记录。

DECLARE @id int = 2
DECLARE @type int

SELECT @type = type FROM Things WHERE Id = @id

IF @type > -1
BEGIN
SELECT T.* FROM Things T
JOIN Relations R ON (R.parent = @id AND T.Type = R.child) OR T.Type = -1
END
ELSE
BEGIN
SELECT * FROM Things
END

所以我必须解决例如@id = 2的情况 - 我需要检索所有行(@id = 5相同,除非它出现在某个父列中的Relations中)。

更新2

我想出了类似的东西:

alpha.26

我非常确定这可以不同的方式完成,没有条件IF,优化。

1 个答案:

答案 0 :(得分:0)

 from Things
 left outer join Relations 
   on Relations.IdParent = Things.Type 
where Things.Type = -1 or Relations.IdParent is null