sybase如何实现两表两列模糊关联匹配

qq_41605257 2018-01-18 03:44:11
表:

A表:ID、姓名、工作单位、户口、身份证号、合同开始时间、合同起止时间。
B表:ID、姓名、单位。

要求:实现A表的工作单位和B表的单位要模糊匹配,且A表的姓名要和B表的姓名一样。

类似这样的句子:select * from a,b where a.姓名 = b.姓名 and (a.工作单位 like '%'+b.单位+'%' or b.单位 like '%'+a.工作单位+'%');

上面这句话只能实现:好又多市场、好又多之间的匹配;但是 好又多市场、好又多超级市场匹配不出来,
本人是菜鸟,希望您能给提供一下具体方法,十分感谢。
...全文
470 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 2018-01-19
  • 打赏
  • 举报
回复
引用 9 楼 qq_41605257 的回复:
非常感谢,只是工作单位不一定是前面两位是相同的,相同的位置不一定。就是说两个字段只要有任意两个连续的字符是一致的就算这两个字段是相同的,请问有什么方法?
加一个函数就可以了:
USE tempdb
GO
-------------- 增加按长度分隔表值函数 -----------------------
IF OBJECT_ID('dbo.Fun_SplitByLenStep1') IS NOT NULL
	DROP FUNCTION dbo.Fun_SplitByLenStep1
GO
-- =============================================
-- Author:		yenange
-- Create date: 2018-01-19
-- Description:	按长度分割字符串
-- =============================================
CREATE FUNCTION dbo.Fun_SplitByLenStep1
(
	@str NVARCHAR(MAX),
	@len INT
)
RETURNS TABLE 
AS
RETURN 
(
	WITH cte AS (
	SELECT 1 AS id FROM MASTER.dbo.spt_values AS sv WHERE sv.[type]='P' 
		AND sv.number BETWEEN 1 AND 1000		--如果字符串很长,可以去掉。限制这个主要是为了性能
	),t2 AS (
		SELECT ROW_NUMBER() OVER ( ORDER BY (SELECT 1)) AS rid  FROM cte AS a CROSS APPLY cte AS b
	)
	SELECT SUBSTRING(@str,rid,@len) AS line FROM t2 WHERE rid<=len(@str)-1
)
GO
IF OBJECT_ID('a') IS NOT NULL DROP TABLE a
IF OBJECT_ID('b') IS NOT NULL DROP TABLE b
GO
CREATE TABLE a(
    ID int,
    姓名 nvarchar(20),
    工作单位 NVARCHAR(20),
    户口 NVARCHAR(20),
    身份证号 VARCHAR(20),
    合同开始时间 datetime,
    合同起止时间 datetime
)
GO
CREATE TABLE b(
    id INT,
    姓名 nvarchar(20),
    单位 nvarchar(20)   
)
GO
INSERT INTO a(id,姓名,工作单位) values(1,'小明','好又多')
INSERT INTO a(id,姓名,工作单位) values(2,'小红','坏又少')
INSERT INTO b(id,姓名,单位) values(1,'小明','好又多超级市场')
INSERT INTO b(id,姓名,单位) values(2,'小明','好又多市场')
INSERT INTO b(id,姓名,单位) values(3,'小明','又多多')
INSERT INTO b(id,姓名,单位) values(4,'小明','故事又多了')
INSERT INTO b(id,姓名,单位) values(5,'小明','好又少超市')

 
SELECT a.id AS aId,a.姓名,a.工作单位,b.单位 FROM a INNER JOIN b 
    ON a.姓名=b.姓名 and exists(
		select 1 from dbo.Fun_SplitByLenStep1(a.工作单位,2) as Ac
		WHERE EXISTS(
			SELECT 1 FROM dbo.Fun_SplitByLenStep1(b.单位,2) as Bc
			WHERE ac.line=bc.line
		)
    )
/*
aId         姓名                   工作单位                 单位
----------- -------------------- -------------------- --------------------
1           小明                   好又多                  好又多超级市场
1           小明                   好又多                  好又多市场
1           小明                   好又多                  又多多
1           小明                   好又多                  故事又多了
1           小明                   好又多                  好又少超市
*/
qq_41605257 2018-01-19
  • 打赏
  • 举报
回复
引用 8 楼 yenange 的回复:
USE tempdb
GO
IF OBJECT_ID('a') IS NOT NULL DROP TABLE a
IF OBJECT_ID('b') IS NOT NULL DROP TABLE b
GO
CREATE TABLE a(
	ID int,
	姓名 nvarchar(20),
	工作单位 NVARCHAR(20),
	户口 NVARCHAR(20),
	身份证号 VARCHAR(20),
	合同开始时间 datetime,
	合同起止时间 datetime
)
GO
CREATE TABLE b(
	id INT,
	姓名 nvarchar(20),
	单位 nvarchar(20)	
)
GO
INSERT INTO a(id,姓名,工作单位) values(1,'小明','好又多')
INSERT INTO a(id,姓名,工作单位) values(2,'小红','坏又少')
INSERT INTO b(id,姓名,单位) values(1,'小明','好又多超级市场')
INSERT INTO b(id,姓名,单位) values(2,'小明','好又多市场')

SELECT a.id AS aId,a.姓名,a.工作单位,b.单位 FROM a INNER JOIN b 
	ON a.姓名=b.姓名 and left(a.工作单位,2)=left(b.单位,2)
/*
aId	姓名	工作单位	单位
1	小明	好又多	    好又多超级市场
1	小明	好又多	    好又多市场
*/

非常感谢,只是工作单位不一定是前面两位是相同的,相同的位置不一定。就是说两个字段只要有任意两个连续的字符是一致的就算这两个字段是相同的,请问有什么方法?
qq_41605257 2018-01-19
  • 打赏
  • 举报
回复
引用 10 楼 yenange 的回复:
[quote=引用 9 楼 qq_41605257 的回复:] 非常感谢,只是工作单位不一定是前面两位是相同的,相同的位置不一定。就是说两个字段只要有任意两个连续的字符是一致的就算这两个字段是相同的,请问有什么方法?
加一个函数就可以了:
USE tempdb
GO
-------------- 增加按长度分隔表值函数 -----------------------
IF OBJECT_ID('dbo.Fun_SplitByLenStep1') IS NOT NULL
	DROP FUNCTION dbo.Fun_SplitByLenStep1
GO
-- =============================================
-- Author:		yenange
-- Create date: 2018-01-19
-- Description:	按长度分割字符串
-- =============================================
CREATE FUNCTION dbo.Fun_SplitByLenStep1
(
	@str NVARCHAR(MAX),
	@len INT
)
RETURNS TABLE 
AS
RETURN 
(
	WITH cte AS (
	SELECT 1 AS id FROM MASTER.dbo.spt_values AS sv WHERE sv.[type]='P' 
		AND sv.number BETWEEN 1 AND 1000		--如果字符串很长,可以去掉。限制这个主要是为了性能
	),t2 AS (
		SELECT ROW_NUMBER() OVER ( ORDER BY (SELECT 1)) AS rid  FROM cte AS a CROSS APPLY cte AS b
	)
	SELECT SUBSTRING(@str,rid,@len) AS line FROM t2 WHERE rid<=len(@str)-1
)
GO
IF OBJECT_ID('a') IS NOT NULL DROP TABLE a
IF OBJECT_ID('b') IS NOT NULL DROP TABLE b
GO
CREATE TABLE a(
    ID int,
    姓名 nvarchar(20),
    工作单位 NVARCHAR(20),
    户口 NVARCHAR(20),
    身份证号 VARCHAR(20),
    合同开始时间 datetime,
    合同起止时间 datetime
)
GO
CREATE TABLE b(
    id INT,
    姓名 nvarchar(20),
    单位 nvarchar(20)   
)
GO
INSERT INTO a(id,姓名,工作单位) values(1,'小明','好又多')
INSERT INTO a(id,姓名,工作单位) values(2,'小红','坏又少')
INSERT INTO b(id,姓名,单位) values(1,'小明','好又多超级市场')
INSERT INTO b(id,姓名,单位) values(2,'小明','好又多市场')
INSERT INTO b(id,姓名,单位) values(3,'小明','又多多')
INSERT INTO b(id,姓名,单位) values(4,'小明','故事又多了')
INSERT INTO b(id,姓名,单位) values(5,'小明','好又少超市')

 
SELECT a.id AS aId,a.姓名,a.工作单位,b.单位 FROM a INNER JOIN b 
    ON a.姓名=b.姓名 and exists(
		select 1 from dbo.Fun_SplitByLenStep1(a.工作单位,2) as Ac
		WHERE EXISTS(
			SELECT 1 FROM dbo.Fun_SplitByLenStep1(b.单位,2) as Bc
			WHERE ac.line=bc.line
		)
    )
/*
aId         姓名                   工作单位                 单位
----------- -------------------- -------------------- --------------------
1           小明                   好又多                  好又多超级市场
1           小明                   好又多                  好又多市场
1           小明                   好又多                  又多多
1           小明                   好又多                  故事又多了
1           小明                   好又多                  好又少超市
*/
[/quote] 菜鸟有点看不懂,不过还是谢谢了,我慢慢研究一下
吉普赛的歌 2018-01-18
  • 打赏
  • 举报
回复
USE tempdb
GO
IF OBJECT_ID('a') IS NOT NULL DROP TABLE a
IF OBJECT_ID('b') IS NOT NULL DROP TABLE b
GO
CREATE TABLE a(
	ID int,
	姓名 nvarchar(20),
	工作单位 NVARCHAR(20),
	户口 NVARCHAR(20),
	身份证号 VARCHAR(20),
	合同开始时间 datetime,
	合同起止时间 datetime
)
GO
CREATE TABLE b(
	id INT,
	姓名 nvarchar(20),
	单位 nvarchar(20)	
)
GO
INSERT INTO a(id,姓名,工作单位) values(1,'小明','好又多')
INSERT INTO a(id,姓名,工作单位) values(2,'小红','坏又少')
INSERT INTO b(id,姓名,单位) values(1,'小明','好又多超级市场')
INSERT INTO b(id,姓名,单位) values(2,'小明','好又多市场')

SELECT a.id AS aId,a.姓名,a.工作单位,b.单位 FROM a INNER JOIN b 
	ON a.姓名=b.姓名 and left(a.工作单位,2)=left(b.单位,2)
/*
aId	姓名	工作单位	单位
1	小明	好又多	    好又多超级市场
1	小明	好又多	    好又多市场
*/

qq_41605257 2018-01-18
  • 打赏
  • 举报
回复
引用 5 楼 sinat_28984567 的回复:
[quote=引用 3 楼 qq_41605257 的回复:] [quote=引用 1 楼 sinat_28984567 的回复:] 这个得定个匹配规则,不然 好又多超级市场 和 超级市场超人 匹配吗?
好又多市场、好又多超级市场那这种情况能不能实现,因为你说的 好又多超级市场 和 超级市场超人 这种我的表里应该不会出现。我这是因为不同的门店做的配置门店名称没有统一,所以还有一些差异,还有一些事字母大小写不一样[/quote] 好又多市场、好又多超级市场 和 好又多超级市场 、 超级市场超人 是一样的,程序代码需要知道规则,比如谁匹配了几个字算是一样的,字的顺序是不是有要求等 [/quote] 只要有两个连续的字是一样的就行,这样可以取吗
听雨停了 2018-01-18
  • 打赏
  • 举报
回复
引用 4 楼 qq_41605257 的回复:
[quote=引用 2 楼 qq_37170555 的回复:] [quote=引用 1 楼 sinat_28984567 的回复:] 这个得定个匹配规则,不然 好又多超级市场 和 超级市场超人 匹配吗?
匹配呀,超人咋能不匹配啊 对不山的自己手动一条条对吧,你这个完全没有规律。[/quote] 是呀,做起来很麻烦[/quote] 你说的这种情况SQL实现不了的。还是那句话对不上的自己手动匹配吧。说到底还是数据源的问题,前期不搞好,后期搞死人啊
二月十六 2018-01-18
  • 打赏
  • 举报
回复
引用 3 楼 qq_41605257 的回复:
[quote=引用 1 楼 sinat_28984567 的回复:] 这个得定个匹配规则,不然 好又多超级市场 和 超级市场超人 匹配吗?
好又多市场、好又多超级市场那这种情况能不能实现,因为你说的 好又多超级市场 和 超级市场超人 这种我的表里应该不会出现。我这是因为不同的门店做的配置门店名称没有统一,所以还有一些差异,还有一些事字母大小写不一样[/quote] 好又多市场、好又多超级市场 和 好又多超级市场 、 超级市场超人 是一样的,程序代码需要知道规则,比如谁匹配了几个字算是一样的,字的顺序是不是有要求等
qq_41605257 2018-01-18
  • 打赏
  • 举报
回复
引用 2 楼 qq_37170555 的回复:
[quote=引用 1 楼 sinat_28984567 的回复:] 这个得定个匹配规则,不然 好又多超级市场 和 超级市场超人 匹配吗?
匹配呀,超人咋能不匹配啊 对不山的自己手动一条条对吧,你这个完全没有规律。[/quote] 是呀,做起来很麻烦
qq_41605257 2018-01-18
  • 打赏
  • 举报
回复
引用 1 楼 sinat_28984567 的回复:
这个得定个匹配规则,不然 好又多超级市场 和 超级市场超人 匹配吗?
好又多市场、好又多超级市场那这种情况能不能实现,因为你说的 好又多超级市场 和 超级市场超人 这种我的表里应该不会出现。我这是因为不同的门店做的配置门店名称没有统一,所以还有一些差异,还有一些事字母大小写不一样
听雨停了 2018-01-18
  • 打赏
  • 举报
回复
引用 1 楼 sinat_28984567 的回复:
这个得定个匹配规则,不然 好又多超级市场 和 超级市场超人 匹配吗?
匹配呀,超人咋能不匹配啊 对不山的自己手动一条条对吧,你这个完全没有规律。
二月十六 2018-01-18
  • 打赏
  • 举报
回复
这个得定个匹配规则,不然 好又多超级市场 和 超级市场超人 匹配吗?
PostgreSQL是以加州大学伯克利分校计算机系开发的POSTGRES,现在已经更名为PostgreSQL. PostgreSQL支持大部分SQL标准并且提供了许多其它现代特性:复杂查询、外键、触发器、视图、事务完整性等。 PostgreSQL 是一个免费的对象-关系数据库服务器(数据库管理系统),它在灵活的 BSD-风格许可证下发行。它提供了相对其他开放源代码数据库系统(比如 MySQL 和 Firebird),和专有系统(比如 Oracle、Sybase、IBM 的 DB2 和 Microsoft SQL Server)之外的另一种选择。 事实上, PostgreSQL 的特性覆盖了 SQL-2/SQL-92 和 SQL-3/SQL-99,首先,它包括了可以说是目前世界上最丰富的数据类型的支持,其中有些数据类型可以说连商业数据库都不具备, 比如 IP 类型和几何类型等;其次,PostgreSQL 是全功能的自由软件数据库,很长时间以来,PostgreSQL 是唯一支持事务、子查询、多版本并行控制系统(MVCC)、数据完整性检查等特性的唯一的一种自由软件的数据库管理系统。 Inprise 的 InterBase 以及SAP等厂商将其原先专有软件开放为自由软件之后才打破了这个唯一。最后,PostgreSQL拥有一支非常活跃的开发队伍,而且在许多黑客的努力下,PostgreSQL 的质量日益提高。从技术角度来讲,PostgreSQL 采用的是比较经典的C/S(client/server)结构,也就是一个客户端对应一个服务器端守护进程的模式,这个守护进程分析客户端来的查询请求,生成规划树,进行数据检索并最终把结果格式化输出后返回给客户端。为了便于客户端的程序的编写,由数据库服务器提供了统一的客户端 C 接口。而不同的客户端接口都是源自这个 C 接口,比如ODBC,JDBC,Python,Perl,Tcl,C/C++,ESQL等, 同时也要指出的是,PostgreSQL 对接口的支持也是非常丰富的,几乎支持所有类型的数据库客户端接口。这一点也可以说是 PostgreSQL 一大优点。 本课程作为PostgreSQL数据库管理二,主要讲解以下内容:1.     PostgreSQL中的子查询2.     PostgreSQL公共表表达式3.     PostgreSQL数据的修改4.     PostgreSQL中的事务5.     PostgreSQL数据导入和导出6.     PostgreSQL数据库的管理7.     PostgreSQL表的管理

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧