我在SQL Server 2008中有一个项目表,其设置如下:
ITEMS TABLE
itemId (PK) | Ref
1 | item1
2 | item2
我还有一个表来存储这些项目的别名:
ALIASES TABLE
aliasId(PK) | objectId(FK) | AliasOfId(FK) | Ref
10 | 50 | 1 | A1
20 | 51 | 2 | A2
30 | 52 | 2 | A3
我正在尝试生成一个查询,以便我可以检索项目列表,但我遇到问题,因为我似乎只能得到任何项目或别名而不是两者(我遇到的问题是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'
我已将数据放入问题中,但似乎已将其重新格式化。这是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')
答案 0 :(得分: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