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.工作单位+'%');

上面这句话只能实现:好又多市场、好又多之间的匹配;但是 好又多市场、好又多超级市场匹配不出来,
本人是菜鸟,希望您能给提供一下具体方法,十分感谢。
...全文
480 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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
  • 打赏
  • 举报
回复
这个得定个匹配规则,不然 好又多超级市场 和 超级市场超人 匹配吗?

22,300

社区成员

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

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