2011-05-23 36 views
0

走样的项目和/或项目我有一个项目表中的SQL Server 2008这是设置如下:我如何检索SQL

项表

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 

我试图生成查询,以使我的CA ñ检索项目列表,但我有问题,我似乎只能得到任何项目或别名不是两个(问题我有LEFT JOIN总是加入别名。

使用的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' 

我已经把数据与问题,但它似乎已经重新格式化它。下面是2008年的SQL

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') 
+0

我建议你的设计是没有意义的,应该改变,因为它决不会轻易或有效的查询完整的数据。这种想法毫无意义,我甚至无法弄清楚你想要完成什么来提出更好的设计。建议您在尝试设计更好的结构之前首先阅读关于数据库规范化的内容。 – HLGEM 2011-05-23 20:23:45

+0

感谢您的回复,并且我完全了解数据库正常化。也许我没有把情况弄清楚。 我试图实现一个相当常见的数据库情况,项目表包含文件夹,并且别名表给出指向文件夹的元素(即文件夹的快捷方式)的新ID。 这是否使它更清晰? – Puc 2011-05-23 20:29:22

+0

尝试给我们提供一些示例数据 – HLGEM 2011-05-23 20:30:47

回答

1
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 
+0

为什么我不这么想!非常感谢。 – Puc 2011-05-23 20:51:21