[英]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
的集合。 例如,如果輸入的字符串是foo
和bar
,我想返回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.