1

我需要找到一种方法,将我在一个表中的数字序列与另一个表中的序列匹配,但如果可能的话,在 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 中返回产品 A 和 D,因为它们是唯一引用所有三个单词的单词,重要的是这些单词的顺序相同,即 2,3,4 与 18,19 相同,20 仅具有不同的数值。

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

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

我希望以上是有道理的

4

2 回答 2

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小提琴演示

于 2012-11-13T16:22:33.990 回答
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)

在这里你可以找到 SQLFiddle。

于 2012-11-13T16:20:52.227 回答