Sql 从表中选择行中任意位置具有两个给定值的所有行

Sql 从表中选择行中任意位置具有两个给定值的所有行,sql,sql-server-2008-r2,Sql,Sql Server 2008 R2,我有一张公共汽车路线表。此表包含诸如公交车号、路线代码、起点、终点等字段,以及从halt1、halt2到halt10的最多10个停车。我已经在这张表中填好了数据。现在我想选择所有有两个值的行,例如斋浦尔和瓦赛。在我的表格中,有两行有斋浦尔和瓦赛。在一行中,斋浦尔位于列halt2中,vasai位于列halt9中。类似地,另一行在halt4列中有斋浦尔,在halt10列中有瓦赛。 请帮我查一下sql查询。我正在使用MS SQL server。 纸条 使用包含 SELECT * WHERE CONTA

我有一张公共汽车路线表。此表包含诸如公交车号、路线代码、起点、终点等字段,以及从halt1、halt2到halt10的最多10个停车。我已经在这张表中填好了数据。现在我想选择所有有两个值的行,例如斋浦尔和瓦赛。在我的表格中,有两行有斋浦尔和瓦赛。在一行中,斋浦尔位于列halt2中,vasai位于列halt9中。类似地,另一行在halt4列中有斋浦尔,在halt10列中有瓦赛。 请帮我查一下sql查询。我正在使用MS SQL server。 纸条


使用
包含

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');

where子句可以由代码生成。

根据您的输入,似乎有必要使用规范化的表结构

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
选择a.路线编号、a.路线代码、a.颜色、a.起点、a.终点、,
a、 海棠
从Mya
内连接myb
在a.id=b.id上
其中a.Halt='jaipur'和b.Halt='vasai'
和a.HaltNum

表结构的更好设计是为所有站点提供一个单独的主表,您只能维护
StopId
StopName
。在
MyRoutes
表中,您可以将HaltId作为外键引用所有站点主表的
StopId
列。然后,上面的查询将需要两次与该表进行内部联接,以获得关于
StopName

的条件。如果需要再添加一个公交车站,该怎么办?在这种情况下,您必须在表中再添加一列(
halt11
)?尝试规范化您的数据库结构,然后您需要的查询将变得简单…您可以发布表结构吗?创建表[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,[halt1][nvarchar](50)空[halt2][nvarchar](50)空[halt3][nvarchar](50)空[halt4][nvarchar](50)空[halt5][nvarchar](50)空[halt6][nvarchar](50)空[halt8][nvarchar](50)空[halt9][nvarchar](50)空[halt10][nvarchar](50)空[halt10][nvarchar](50)NULL,是的valex是对的。两个站点之间可能有50次暂停,您应该进行规范化。请将架构放到问题部分,而不是评论中。我没有至少10个声誉,否则我可以发布表的图像。请投票,以便我可以上传图像。
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