从表中选择具有两个给定值的行中的所有行

时间:2014-02-24 07:38:23

标签: sql sql-server-2008-r2

我有一张巴士路线表。这张桌子有像巴士一样的字段。 ,路线代码,起点,终点,以及从halt1,halt2 ... halt10最多停止10次。我已填写此表中的数据。现在我想选择所有具有两个值的行,例如jaipur和vasai。在我的表中,有两排有斋浦尔和瓦塞伊。在一行中,斋浦尔在列halt2中,vasai在halt9中。类似地,另一行在halt4列中具有jaipur而在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

3 个答案:

答案 0 :(得分: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');

答案 1 :(得分:0)

SELECT * FROM bus_rout WHERE (halt1='aaa' OR halt2='aaa' OR .... halt10='aaa') AND (halt1='bbb' OR halt2='bbb' OR ....... halt10='bbb')

where子句可以由代码生成。

答案 2 :(得分: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

更好的表结构设计是为所有Stops设置单独的主表,您只能维护StopIdStopName。在MyRoutes表中,您可以将HaltId作为all stop master表的外键引用StopId列。然后,上述查询需要与此表进行两次内连接才能在StopName

上具有条件