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を返したいのは、3つの単語すべてを参照しているのはこれらの単語だけであり、重要なことに、これらの単語は同じ順序で並んでいるためです。つまり、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 に答える