2014-11-09 118 views
0

我有三个表链,酒店和壳牌。酒店表链接链表和外壳表与两个表的链接。SQL查询不能正常工作

表结构:---

// 2级

ChainID | ChainName 

酒店 // 3级

HotelID | HotelName | ChainID 

壳牌

ShellID | ShellName | Chain_Hotel_ID | Level 

在壳牌表,Chain_Hotel_ID柱保持(连锁和酒店)表ChainID和HotelID和等级栏中按住INT值2和3。链认为是2和酒店3

从这些表我想

ShellID | ShellName | ChainName 

我编写一个查询为,但它不工作,我想

select 
    _gs.ShellID, _gs.ShellName, _gc.ChainName 
from 
    Shell _gs, Chain _gc 
where 
    _gc.ChainID in (select _lh.ChainID 
        from Shell _ls,Hotel _lh 
        where _lh.HotelID = _ls.Chain_Hotel_ID and _ls.Level = 3) 
    and _gs.Level = 3 

样品表数据

ChainID | ChainName 
    1  | Sarovar 
    2  | Taj Group 
    3  | Oberoi 

酒店

HotelID | HotelName | ChainID 
    1  | RadhaRegent |  1 
    2  | SarovarPortic |  1 
    3  | LaxmiVilas |  1 
    4  | Taj Mumbai |  2 
    5  | Taj Delhi  |  2 
    6  | Oberoi Delhi |  3 

壳牌

ShellID | ShellName | Chain_Hotel_ID | Level 
    1  | Shell1  |  1    |  2 
    2  | Shell2  |  1    |  2 
    3  | Shell3  |  2    |  3 
    4  | Shell4  |  3    |  2 
    5  | Shell5  |  2    |  3 
    6  | Shell6  |  3    |  3 
    7  | Shell7  |  4    |  3 

输出

ShellID | ShellName | ChainName  
    3  | Shell3  |  Sarovar   
    5  | Shell5  |  Sarovar   
    6  | Shell6  |  Sarovar   
    7  | Shell7  |  Taj Group 
    3  | Shell3  |  Sarovar   
    5  | Shell5  |  Sarovar   
    6  | Shell6  |  Sarovar   
    7  | Shell7  |  Taj Group 

我[R反复数据

+3

请出示一些示例数据和预期输出与sqlfiddle.com – 2014-11-09 08:31:23

+4

[不良习惯踢:使用OLD- style JOINs](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx) - 旧式*逗号 - 在ANSI - ** 92 ** SQL标准(**超过20年**之前)中,* *样式的分隔列表被替换为* proper * ANSI'JOIN'语法,不鼓励 – 2014-11-09 08:31:26

+0

@安杰尔你的期望输出是什么? – 2014-11-09 08:51:46

回答

2

这是你所需要的?

IF LEVEL=3 
BEGIN 
SELECT DISTINCT ShellID, ShellName, ChainName 
FROM HOTEL JOIN SHELL 
ON HOTEL.CHAINID=SHELL.CHAIN_HOTEL_ID 
JOIN 
CHAIN ON CHAIN.CHAINID=HOTEL.CHAINID 
END 
0

您只需按给定顺序连接表:Shell - > Hotel - > Chain。

下面是代码示例:

SELECT 
    s.Id AS ShellID, s.Name AS ShellName, c.Name AS ChainName 
FROM #shell s 
INNER JOIN #hotel h ON h.Id = s.HotelId 
INNER JOIN #chain c ON c.Id = h.ChainID 
WHERE s.Level = 3 

全面上市,以测试:

CREATE TABLE #chain (Id INT, Name varchar(50)) 
GO 
INSERT INTO #chain VALUES (1, 'Sarovar'), (2, 'Taj Group'), (3, 'Oberoi') 
GO 

CREATE TABLE #hotel (Id INT, Name varchar(50), ChainId INT) 
GO 
INSERT INTO #hotel VALUES 
    (1, 'RadhaRegent' , 1), 
    (2, 'SarovarPortic' , 1), 
    (3, 'LaxmiVilas' , 1), 
    (4, 'Taj Mumbai' , 2), 
    (5, 'Taj Delhi'  , 2), 
    (6, 'Oberoi Delhi' , 3) 
GO 

CREATE TABLE #shell (Id INT, Name varchar(50), HotelId INT, Level INT) 
GO 
INSERT INTO #shell VALUES 
    (1, 'Shell1', 1, 2), 
    (2, 'Shell2', 1, 2), 
    (3, 'Shell3', 2, 3), 
    (4, 'Shell4', 3, 2), 
    (5, 'Shell5', 2, 3), 
    (6, 'Shell6', 3, 3), 
    (7, 'Shell7', 4, 3) 
GO 

SELECT 
    s.Id AS ShellID, s.Name AS ShellName, c.Name AS ChainName 
FROM #shell s 
INNER JOIN #hotel h ON h.Id = s.HotelId 
INNER JOIN #chain c ON c.Id = h.ChainID 
WHERE s.Level = 3 

DROP TABLE #chain; 
GO 
DROP TABLE #hotel; 
GO 
DROP TABLE #shell; 
GO