如何在SQL中检索别名项和/或项
我在SQL Server 2008中有一个项目表,其设置如下: 项目表如何在SQL中检索别名项和/或项,sql,sql-server,Sql,Sql Server,我在SQL Server 2008中有一个项目表,其设置如下: 项目表 itemId (PK) | Ref 1 | item1 2 | item2 我还有一个表来存储这些项目的别名: 别名表 aliasId(PK) | objectId(FK) | AliasOfId(FK) | Ref 10 | 50 | 1 | A1 20 | 51 | 2
itemId (PK) | Ref
1 | item1
2 | item2
我还有一个表来存储这些项目的别名:
别名表
aliasId(PK) | objectId(FK) | AliasOfId(FK) | Ref
10 | 50 | 1 | A1
20 | 51 | 2 | A2
30 | 52 | 2 | A3
我试图生成一个查询,以便检索项目列表,但我遇到的问题是,我似乎只能获取项目或别名,而不能同时获取两者(我遇到的问题是左连接始终连接到别名)
下面是使用的SQL。有什么想法,谢谢你的帮助吗
SELECT
ISNULL(A.objectId,I.itemId) AS itemId
,ISNULL(A.ref,I.ref) AS ref
,isAlias = CASE WHEN A.aliasID IS NULL THEN 1 ELSE 0 END
FROM items I
LEFT JOIN aliases A ON (I.itemId = A.AliasOfId)
WHERE
ISNULL(A.objectId,I.itemId) = 1
OR ISNULL(A.objectId,I.itemId) = 51
OR ISNULL(A.ref,I.ref) = 'A3'
我在问题中加入了数据,但它似乎已重新格式化。以下是SQL 2008中的完整数据
CREATE TABLE [items]
( [itemId] [int] NOT NULL
, [ref] [varchar](50) NOT NULL )
ON [PRIMARY]
CREATE TABLE [aliases]
( [aliasId] [int] NOT NULL
, [objectId] [int] NOT NULL
, [aliasOfId] [int] NOT NULL
, [ref] [varchar](50) NOT NULL )
ON [PRIMARY]
INSERT INTO [items] ([itemId],[ref])
VALUES (1, 'Item1'),(2, 'Item2')
INSERT INTO [aliases] ([aliasId],[objectId],[aliasOfId],[ref])
VALUES
(10, 50, 1, 'A1')
,(20, 51, 2, 'A2')
,(30, 52, 2, 'A3')
我建议您的设计毫无意义,应该进行更改,因为它永远不会很容易或高效地进行查询。它毫无意义,我甚至无法理解您为提出更好的设计而尝试完成的工作。建议您在尝试设计更好的结构之前先阅读数据库规范化。感谢您的回复,我完全了解数据库的正常化。也许我没有把情况说清楚。我正在尝试实现一种非常常见的DB情况,items表包含文件夹,Alias表为指向文件夹的元素提供了新ID(即文件夹的快捷方式)。这能让我们更清楚吗?试着给我们一些示例数据我在问题中加入了数据,但它似乎已重新格式化。这是SQL 2008中的完整数据。在[PRIMARY]上创建表[items]([itemId][int]不为NULL,[ref][varchar](50)不为NULL)创建表[Alias]([aliasId][int]不为NULL,[objectId][int]不为NULL,[aliasOfId][int]NOT NULL,[ref][varchar](50)NOT NULL)在[PRIMARY]上插入[items]([itemId],[ref])值(1,'Item1'),(2,'Item2')插入[aliasId]([aliasId],[objectId],[aliasOfId],[ref])值(10,50,1,'A1'),(20,51,2,'A2'),(30,52,2,'A3')为什么我没有想到这些!!非常感谢。
SELECT
Ref AS item
ItemId
Ref
1 AS isAlias
FROM
items i
UNION ALL
SELECT
i.Ref AS item
a.objectID AS itemId
a.Ref AS ref
0 AS isAlias
FROM
items i
JOIN
aliases a
ON i.itemId = a.AliasOfId