智能多对多查询

时间:2012-11-16 20:37:40

标签: sql-server sql-server-2008

我在c#应用程序中有一个项目描述列表。我想要的是我选择的时候 该列表的1或2个或更多项目描述(复选框列表)通过sql查询预测我的项目是多少表(每次最小化可能的预测);

例如

item 1: white,green,blue
item 2: white,red,cyan
item 3: red,blue,purple
  • 用户应从核对清单中选择
  • white->查询将返回第1,2项
  • white& green->查询将仅返回第1项

1 个答案:

答案 0 :(得分:2)

从你对问题的谦虚描述中,我想你想要这样的事情:

 CREATE TABLE items (
    item_id INT NOT NULL PRIMARY KEY IDENTITY(1,1),
    name VARCHAR(100) NOT NULL
)

CREATE TABLE colors (
    color_id INT NOT NULL PRIMARY KEY IDENTITY(1,1),
    name VARCHAR(100) NOT NULL
)

CREATE TABLE items_colors (
    item_id INT NOT NULL FOREIGN KEY REFERENCES items(item_id),
    color_id INT NOT NULL FOREIGN KEY REFERENCES colors(color_id),
    PRIMARY KEY(item_id, color_id),
)

INSERT INTO items(name) VALUES ('item 1')
INSERT INTO items(name) VALUES ('item 2')
INSERT INTO items(name) VALUES ('item 3')

INSERT INTO colors(name) VALUES ('white')
INSERT INTO colors(name) VALUES ('green')
INSERT INTO colors(name) VALUES ('blue')
INSERT INTO colors(name) VALUES ('red')
INSERT INTO colors(name) VALUES ('cyan')
INSERT INTO colors(name) VALUES ('purple')

INSERT INTO items_colors(item_id, color_id) VALUES (1, 1)
INSERT INTO items_colors(item_id, color_id) VALUES (1, 2)
INSERT INTO items_colors(item_id, color_id) VALUES (1, 3)

INSERT INTO items_colors(item_id, color_id) VALUES (2, 1)
INSERT INTO items_colors(item_id, color_id) VALUES (2, 4)
INSERT INTO items_colors(item_id, color_id) VALUES (2, 5)

INSERT INTO items_colors(item_id, color_id) VALUES (3, 3)
INSERT INTO items_colors(item_id, color_id) VALUES (3, 4)
INSERT INTO items_colors(item_id, color_id) VALUES (3, 6)

SELECT i.* 
FROM items i 
WHERE 2 = (
    SELECT COUNT(*)
    FROM items_colors ic
    JOIN colors c
    ON ic.color_id = c.color_id
    WHERE i.item_id = ic.item_id
    AND c.name IN ('white', 'green')
)

在“IN”子句中,您应该提供用户在UI中选择的值列表(您必须动态构建参数列表)。您还必须提供用户选择的元素数量(在我的示例解决方案中为“2”)。

因此,应用程序中的查询将如下所示:

SELECT i.* 
FROM items i 
WHERE @count = (
    SELECT COUNT(*)
    FROM items_colors ic
    JOIN colors c
    ON ic.color_id = c.color_id
    WHERE i.item_id = ic.item_id
    AND c.name IN (@color1, @color2, ..., @colorN)
)

(其中@count是@colorX参数的数量。)