2012-11-13 71 views
1

我需要找到一種方法將我在一個表中的數字序列與另一個表中的序列進行匹配,如果可能的話,在SQL中使用不同的數字值。在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我希望它返回。

希望以上有意義

+2

+1與這樣一個尷尬的問題;-) –

+1

這RDBMS SQL Server的同情?還是Oracle? –

+1

SQL 2012 - 我一直對此感到頭痛,並且沒有快樂。我認爲我通過將位置asc的單詞排序爲單個字符串,然後按產品編號進行分組,然後執行PATINDEX,但是這返回了匹配字符串的產品,但沒有按順序排列 – user1821294

回答

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

+0

如果更改了('Fox',21,'D')'這是行不通的。 – ShyJ

+0

@ShyJ:不應該按照問題 –

+0

@ShyJ工作:請在問題中注意這一行..「注意,訂單通常不會像2,3,4那麼簡單,它可能是2,7,9在這種情況下,如果一個產品的所有單詞的數量是36,41,43,我希望它返回。「 –

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。