【问题标题】:Matching a number pattern in sql匹配sql中的数字模式
【发布时间】:2012-11-13 16:00:29
【问题描述】:

我需要找到一种方法,将我在一个表中的数字序列与另一个表中的序列匹配,但如果可能的话,在 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

基本上我只想从表 B 中返回 Product A 和 D,因为它们是唯一引用所有三个单词的单词,重要的是这些单词的顺序相同,即 2、3、4 与18,19,20 仅具有不同的数值。

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

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

我希望以上内容有意义

【问题讨论】:

  • +1 同情这样一个尴尬的问题 ;-)
  • 哪个 RDBMS sql 服务器?还是甲骨文?
  • SQL 2012 - 我已经为此苦苦思索了一段时间,但并不高兴。我以为我通过按位置 asc 将单词排序为单个字符串并按产品 id 分组然后执行 PATINDEX 来实现它,但是虽然这返回了与字符串匹配的产品,但它并没有考虑到顺序

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


【解决方案1】:

试试这个:

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

【讨论】:

  • 如果您将 fiddle 中的最后一行更改为 ('Fox', 21, 'D') 它将不起作用。
  • @ShyJ:请注意问题中的这一行。“请注意,通常顺序不会像 2,3,4 那样简单,它可能是 2,7,9,在这种情况下,如果一个产品的所有单词都按 36、41、43 的顺序排列,我希望它返回。"
  • 感谢乔,这似乎确实有效,并给了我想要的东西。我确实将 = 3 更改为 = (SELECT COUNT(1) FROM TableA) 但除此之外它过滤掉了它应该过滤的记录。我将在第二天左右使用不同的用例进行更多负载测试,如果我有更多问题,我会标记它们。再次感谢
【解决方案2】:

架构和数据:

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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-22
    • 2020-03-07
    • 2013-02-12
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多