2011-01-25 15 views
5

otrzymuje następujące dwie tabele:SQL Multiple Łączy

CREATE TABLE [dbo].[MTCorrelations] 
(
    [CorrelationID] [int] IDENTITY(1,1) NOT NULL, 
    [StockA] [nvarchar](5) NOT NULL, 
    [StockB] [nvarchar](5) NOT NULL, 
    [Correlation] [float] NOT NULL, 
    [LengthStr] [nvarchar](5) NOT NULL, 
    [Date] [datetime] NOT NULL 
) 

CREATE TABLE [dbo].[Industries] 
(
    [IndustryID] [int] IDENTITY(1,1) NOT NULL, 
    [Symbol] [nvarchar](5) NOT NULL, 
    [Sector] [nvarchar](50) NULL, 
    [Industry] [nvarchar](50) NULL 
) 

Próbuję patrzeć odpowiednie gałęzie przemysłu Stocka i StockB od stołu Industries. Jednak nie wiem, jak wykonać wiele złączeń. To jest najlepsze, co mogę wymyślić:

SELECT TOP 1000 
[CorrelationID] 

     ,[StockA] 
     ,[StockB] 
     ,[Correlation] 
     ,b.Industry 
     ,c.Industry 
    FROM [MarketTopology].[dbo].[MTCorrelations] as a JOIN [MarketTopology].[dbo].[Industries] as b ON a.StockA = b.Symbol 
    AND a JOIN [MarketTopology].[dbo].[Industries] as c ON a.StockB = c.Symbol 

Dostaję błąd na AND. Jaki jest prawidłowy sposób robienia tego?

Odpowiedz

2

Usuń AND a i po prostu kolejnym JOIN

SELECT TOP 1000 
      [CorrelationID], 
      [StockA], 
      [StockB], 
      [Correlation], 
      b.Industry, 
      c.Industry 
    FROM [MarketTopology].[dbo].[MTCorrelations] AS a 
    JOIN [MarketTopology].[dbo].[Industries] AS b 
    ON a.StockA = b.Symbol 
    JOIN [MarketTopology].[dbo].[Industries] AS c 
    ON a.StockB = c.Symbol 
3
SELECT TOP 1000 
     [CorrelationID] 
     ,[StockA] 
     ,[StockB] 
     ,[Correlation] 
     ,b.Industry 
     ,c.Industry 
FROM [MarketTopology].[dbo].[MTCorrelations] AS a 
JOIN [MarketTopology].[dbo].[Industries] AS b 
ON  b.Symbol = a.StockA 
JOIN [MarketTopology].[dbo].[Industries] AS c 
ON  c.Symbol = a.StockB 
2

Można użyć:

SELECT TOP 1000 
     [CorrelationID], 
     [StockA], 
     [StockB], 
     [Correlation], 
     b.Industry, 
     c.Industry 
FROM [MarketTopology].[dbo].[MTCorrelations] as a 
      JOIN [MarketTopology].[dbo].[Industries] as b ON a.StockA = b.Symbol 
      JOIN [MarketTopology].[dbo].[Industries] as c ON a.StockB = c.Symbol 
2

Spróbuj

SELECT TOP 1000 
    [CorrelationID] 
    ,[StockA] 
    ,[StockB] 
    ,[Correlation] 
    ,b.Industry 
    ,c.Industry 
FROM 
    [MarketTopology].[dbo].[MTCorrelations] as a 
    INNER JOIN [MarketTopology].[dbo].[Industries] as b 
     ON a.StockA = b.Symbol 
    INNER JOIN [MarketTopology].[dbo].[Industries] as c 
     ON a.StockB = c.Symbol 

Również IMO powinieneś ge tz dala od konwencji aliasów A, B, C i podaj aliasy tabel, które coś znaczą. W ten sposób, niezależnie od zapytania, na które patrzysz, Ind może zawsze być shortform dla Industries.

0

Nie ma potrzeby przed przed drugim złączeniem.

SELECT TOP 1000 [CorrelationID] 
       ,[StockA] 
       ,[StockB] 
       ,[Correlation] 
       ,b.Industry 
       ,c.Industry 
    FROM [MarketTopology].[dbo].[MTCorrelations] as a 
     JOIN [MarketTopology].[dbo].[Industries] as b 
      ON a.StockA = b.Symbol 
     JOIN [MarketTopology].[dbo].[Industries] as c 
      ON a.StockB = c.Symbol 
0

Twoje zapytanie zawiera literówkę. Zmień to na:

SELECT TOP 1000 
[CorrelationID] 

     ,[StockA] 
     ,[StockB] 
     ,[Correlation] 
     ,b.Industry 
     ,c.Industry 
    FROM [MarketTopology].[dbo].[MTCorrelations] as a JOIN [MarketTopology].[dbo].[Industries] as b ON a.StockA = b.Symbol 
    JOIN [MarketTopology].[dbo].[Industries] as c ON a.StockB = c.Symbol