2014-02-24 39 views
1

我有一張公交路線表。這張桌子有巴士號碼的字段。 ,路線代碼,起點,終點以及從halt1,halt2 ... halt10開始的最多10次暫停。我已經填寫了這張表中的數據。現在我想選擇具有兩個值的所有行,例如齋普爾和瓦西。在我的桌子上,有兩排有齋普爾和瓦西。在一行中,齋浦爾在halt2列和vasai在halt9列。同樣,另一排有halt4欄中的齋浦爾和halt10欄中的vasai。 請幫我找出sql查詢。我正在使用MS SQL服務器。 憑證從表中選擇行中有兩個給定值的所有行

USE [JaipuBus] 
GO 

/****** Object: Table [dbo].[MyRoutes] Script Date: 02/24/2014 13:28:54 ******/ 
SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

CREATE TABLE [dbo].[MyRoutes](
    [id] [int] IDENTITY(1,1) NOT NULL, 
    [Route_No] [nvarchar](50) NULL, 
    [Route_Code] [nvarchar](50) NULL, 
    [Color] [nvarchar](50) NULL, 
    [Start_Point] [nvarchar](200) NULL, 
    [End_Point] [nvarchar](200) NULL, 
    [halt1] [nvarchar](50) NULL, 
    [halt2] [nvarchar](50) NULL, 
    [halt3] [nvarchar](50) NULL, 
    [halt4] [nvarchar](50) NULL, 
    [halt5] [nvarchar](50) NULL, 
    [halt6] [nvarchar](50) NULL, 
    [halt7] [nvarchar](50) NULL, 
    [halt8] [nvarchar](50) NULL, 
    [halt9] [nvarchar](50) NULL, 
    [halt10] [nvarchar](50) NULL, 
CONSTRAINT [PK_MyRoutes] PRIMARY KEY CLUSTERED 
(
    [id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

enter image description here

+0

如果您需要添加一個公交車站 - 在這種情況下,您必須在您的表中添加一個COLUMN('halt11') ?試着規範你的DB結構,然後你需要的查詢將變得簡單... – valex

+0

你可以發佈表結構嗎? –

+0

CREATE TABLE [DBO]。[MyRoutes]( \t [ID] [INT] IDENTITY(1,1)NOT NULL, \t [Route_No] [nvarchar的](50)NULL, \t [Route_Code] [nvarchar的]( 50)NULL, \t [彩色] [nvarchar的](50)NULL, \t [Start_Point] [nvarchar的](200)NULL, \t [End_Point] [nvarchar的](200)NULL, \t [halt1] [nvarchar的](50)NULL, \t [halt2] [nvarchar的](50)NULL, \t [halt3] [nvarchar的](50)NULL, \t [halt4] [nvarchar的](50)NULL, \t [halt5] [nvarchar的](50)NULL, \t [halt6] [nvarchar的](50)NULL, \t [halt7] [nvarchar的](50)NULL, \t [halt8] [nvarchar的](50) NULL, \t [halt9] [nvarchar](50)NULL, \t [halt10] [nvarchar](50)NULL, yes valex is right。兩站之間可能會有50次暫停 –

回答

0

使用CONTAINS

SELECT * 
WHERE CONTAINS((startingpoint,endpoint,halt1,halt2,halt3,halt4,halt5,halt6,halt7,halt8,halt9,halt10), 'jaipur') 
    AND CONTAINS((startingpoint,endpoint,halt1,halt2,halt3,halt4,halt5,halt6,halt7,halt8,halt9,halt10), 'vasai'); 
0
SELECT * FROM bus_rout WHERE (halt1='aaa' OR halt2='aaa' OR .... halt10='aaa') AND (halt1='bbb' OR halt2='bbb' OR ....... halt10='bbb') 

的其中可通過代碼來生成子句。

0

根據您的意見,您似乎有必要擁有標準化表格結構。

CREATE TABLE [dbo].[MyRoutes]( 
    [id] [int] IDENTITY(1,1) NOT NULL, 
    [Route_No] [nvarchar](50) NULL, 
    [Route_Code] [nvarchar](50) NULL, 
    [Color] [nvarchar](50) NULL, 
    [Start_Point] [nvarchar](200) NULL, 
    [End_Point] [nvarchar](200) NULL, 
    [HaltNum] INT, 
    [Halt] [nvarchar](50) NULL 
) 

然後解決路由問題的查詢可以寫成如下:

SELECT a.Route_No, a.Route_Code, a.Color, a.Start_Point, a.End_Point, 
a.HaltNum StartNum, b.HaltNum StopNum 
FROM MyRoutes a 
INNER JOIN MyRoutes b 
ON a.id = b.id 
WHERE a.Halt = 'jaipur' AND b.Halt = 'vasai' 
AND a.HaltNum < b.HaltNum 

更好的設計表結構將有一個單獨的主表的所有停止在那裏你可以保持只有StopIdStopName。在MyRoutes表中,您可以將HaltId作爲外部關鍵字參考全部停止主表的StopId列。上面的查詢然後需要兩次與這個表內部連接以獲得條件StopName

相關問題