簡體   English   中英

表中的多個記錄與一列匹配

[英]Multiple records in a table matched with a column

我的數據庫的體系結構涉及標簽表中的記錄。 Tags表中的每個記錄都有一個字符串,該字符串是Name並且與另一個Worker表中的記錄的PrimaryID's

Worker表中的記錄具有標簽。 每次我們為工作人員創建標簽時,我們都會在“標簽”表中添加帶有輸入的名稱和工作人員的PrimaryID外鍵的新行。 因此,每個同一個工作人員可以有多個名稱不同的標簽。

工人表

ID         |   Worker Name    |    Other Information
__________________________________________________________________
1          |   Worker1        | ..........................
2          |   Worker2        | ..........................
3          |   Worker3        | ..........................
4          |   Worker4        | ..........................

標簽表

ID         |Foreign Key(WorkerID) |    Name
__________________________________________________________________
1          |   1                  | foo
2          |   1                  | bar
3          |   2                  | foo
5          |   3                  | foo
6          |   3                  | bar
7          |   3                  | baz
8          |   1                  | qux

我的目標是根據輸入的字符串表過濾WorkerID 我想獲得與輸入的標簽具有相同標簽的WorkerID的集合。 例如,如果輸入的字符串是foobar ,我想返回WorkerID的1和3。任何想法如何做到這一點? 我在想與GROUP BY或JOINING表有關。 我是SQL的新手,似乎無法弄清楚。

這是關系划分的一種變體。 這是一種嘗試:

select workerid 
from tags
where name in ('foo', 'bar')
group by workerid
having count(distinct name) = 2

您可以使用以下內容:

select WorkerID
from tags where name in ('foo', 'bar')
group by WorkerID
having count(*) = 2

這將檢索您想要的結果/

問候。

本文是有關該主題的出色資源。

雖然@Lennart的答案在Query Analyzer中運行良好,但如果不對SQL注入攻擊開放,您將無法在存儲過程或消費應用程序中復制該答案。 為了擴展該解決方案,您將要考慮將標記列表作為表值參數傳遞,因為SQL不支持數組。

本質上,您可以在數據庫中創建一個自定義類型,以模仿僅包含一列的表:

CREATE TYPE list_of_tags AS TABLE (t varchar(50) NOT NULL PRIMARY KEY)

然后在內存中填充該類型的實例:

DECLARE @mylist list_of_tags
INSERT @mylist (t) VALUES('foo'),('bar')

然后,您可以使用前面的答案中所述的GROUP BY / HAVING將其選擇為聯接:

select workerid 
from tags inner join @mylist on tag = t    
group by workerid
having count(distinct name) = 2

*注意:我不在可以測試查詢的計算機上。 如果有人發現我的查詢有缺陷,請告訴我,我們將很樂意更正並感謝他們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM