匹配sql中的数字模式

时间:2012-11-13 16:00:30

标签: sql sql-server sql-server-2012

我需要找到一种方法来将我在一个表中的数字序列与另一个表中的序列进行匹配,但如果可能的话,在SQL中使用不同的数值。

示例:

Table A contains

Word   | Location
-----------------
Quick    2
Brown    3
Fox      4

Table B contains

Word   |  Location  | Product
------------------------------
Quick        2           A
Brown        3           A
Fox          4           A
Brown        8           B
Fox          9           B
Quick        10          B
Quick        7           C
Quick        18          D
Brown        19          D
Fox          20          D

基本上我只想退回产品A&表B中的D是因为它们是唯一一个引用所有三个单词的人,重要的是这些单词是相同的有序序列,即2,3,4与18,19,20相同,只是具有不同的数值。

很容易找到所有引用所有单词的产品,但我只想要按正确顺序匹配所有相同单词的产品。

请注意,订单通常不会像2,3,4一样简单,可能是2,7,9,在这种情况下,如果产品的所有单词的顺序为36,41,43 I会希望它返回。

我希望上述内容有意义

2 个答案:

答案 0 :(得分:2)

试试这个:

select PRODUCT
from   (
select A.Word,A.Location-B.Location as diff,B.PRODUCT
from   TableA A
join   TableB B
on     A.Word=B.Word)C
group by diff,PRODUCT
having count(*)=3


SQL fiddle demo

答案 1 :(得分:1)

架构和数据:

CREATE TABLE A
    (     
     Word varchar(10),
     Location int                  
    );

CREATE TABLE B
    (Word varchar(10),
     Location int,
     Product varchar(3));

INSERT INTO A (Word, Location)
VALUES
  ('Quick', 2),
  ('Brown', 3),
  ('Fox', 4);

INSERT INTO B (Word, Location, Product)
VALUES
  ('Quick', 2, 'A'),
  ('Brown', 3, 'A'),
  ('Fox', 4, 'A'),
  ('Brown', 8, 'B'),
  ('Fox', 9, 'B'),
  ('Quick', 10, 'B'),
  ('Quick', 7, 'C'),
  ('Quick', 18, 'D'),
  ('Brown', 19, 'D'),
  ('Fox', 20, 'D');

查询:

SELECT Product
FROM B B1
WHERE (
  SELECT COUNT(*) 
  FROM B B2
  WHERE B2.Location < B1.Location
    AND B2.Product = B1.Product) = (
  SELECT COUNT(*) 
  FROM A A1 JOIN A A2 ON A1.Word = B1.Word
  WHERE A2.Location < A1.Location)
GROUP BY Product
HAVING COUNT(*) = (SELECT COUNT(*) FROM A)

Here你可以找到SQLFiddle。