如何在SQL中检索别名项和/或项

如何在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

我在SQL Server 2008中有一个项目表,其设置如下:

项目表

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