2011-01-25 40 views
5

Với hai bảng sau:SQL Nhiều tham gia

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 
) 

tôi đang cố gắng để tìm kiếm các ngành công nghiệp của StockA và StockB từ bảng Industries. Tuy nhiên tôi không biết làm thế nào để làm nhiều tham gia. Đây là điều tốt nhất tôi có thể đưa ra:

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 

Tôi gặp lỗi trên AND. Cách làm đúng là gì?

Trả lời

2

Tháo AND a và chỉ có bên cạnh 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

Bạn có thể sử dụng:

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

Hãy thử điều này

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 

Ngoài ra, IMO bạn nên ge không sử dụng quy ước bí danh A, B, C và cung cấp cho các bí danh của bảng có nghĩa là gì đó. Bằng cách đó, bất kể truy vấn bạn đang xem là gì, Ind luôn có thể là shortform cho Industries.

0

Không cần AND a trước lần tham gia thứ hai.

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

Truy vấn của bạn có lỗi đánh máy. Thay đổi nó thành:

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