在c#或sql中,如何从具有不同条件的同一个表中获取公共数据
我有两个表,一个表由itemID和name列组成 另一个表是Location,其列为ItemID、LocationID 每个项目可以有多个位置 例如:我有3个项目鼠标,键盘,扬声器在c#或sql中,如何从具有不同条件的同一个表中获取公共数据,c#,sql,C#,Sql,我有两个表,一个表由itemID和name列组成 另一个表是Location,其列为ItemID、LocationID 每个项目可以有多个位置 例如:我有3个项目鼠标,键盘,扬声器 鼠标位于4个位置-A、B、C、D 键盘有两个位置-A、C 扬声器位于3个位置-A、B、C 现在我想要一个c#或sql代码,它将为我提供当前示例中所有3项的公共位置,即a。我想您需要: select l.locationid from locations l group by l.locationid having
- 鼠标位于4个位置-A、B、C、D
- 键盘有两个位置-A、C
- 扬声器位于3个位置-A、B、C
select l.locationid
from locations l
group by l.locationid
having count(*) = (select count(*) from items);
这假设行在位置中是唯一的。否则,请使用计数(不同的项目ID)
是一个显示其工作原理的数据小提琴。试试LINQ union:
int[] ints1 = { 5, 3, 9, 7, 5, 9, 3, 7 };
int[] ints2 = { 8, 3, 6, 4, 4, 9, 1, 0 };
IEnumerable<int> union = ints1.Union(ints2);
int[]ints1={5,3,9,7,5,9,3,7};
int[]ints2={8,3,6,4,4,9,1,0};
IEnumerable并集=ints1.union(ints2);
你能试试这个吗 您可以尝试在SQL Server中使用PIVOT,也许它对您有用
CREATE TABLE #items (
ID_item int,
name varchar(20)
)
CREATE TABLE #item_location (
ID_item int,
ID_location char(1)
)
INSERT INTO #items( ID_item, name ) VALUES (1,'Mouse')
INSERT INTO #items( ID_item, name ) VALUES (2,'Keyboard')
INSERT INTO #items( ID_item, name ) VALUES (3,'Speaker')
INSERT INTO #item_location (ID_item, ID_location) VALUES (1,'A')
INSERT INTO #item_location (ID_item, ID_location) VALUES (1,'B')
INSERT INTO #item_location (ID_item, ID_location) VALUES (1,'C')
INSERT INTO #item_location (ID_item, ID_location) VALUES (1,'D')
INSERT INTO #item_location (ID_item, ID_location) VALUES (2,'A')
INSERT INTO #item_location (ID_item, ID_location) VALUES (2,'C')
INSERT INTO #item_location (ID_item, ID_location) VALUES (3,'A')
INSERT INTO #item_location (ID_item, ID_location) VALUES (3,'B')
INSERT INTO #item_location (ID_item, ID_location) VALUES (3,'C')
--SELECT B.ID_location, COUNT(1)
--FROM #items AS A
--INNER JOIN #item_location AS B ON A.ID_item = B.ID_Item
--GROUP BY B.ID_Location;
DECLARE @sql NVARCHAR(max);
DECLARE @columns VARCHAR(200);
SET @columns = STUFF(
(
SELECT
','+ QUOTENAME(LTRIM(name))
FROM
(SELECT DISTINCT
A.name
FROM #items AS A
) AS T
FOR XML PATH('')
), 1, 1, '')
SET @sql = N'
SELECT
*
FROM
(
SELECT ID_location,name
FROM #item_location A INNER JOIN #items B ON B.ID_item = A.ID_item
) AS T
PIVOT
(
count(name)
FOR name IN (' + @columns + N')
) AS P order by ID_location;';
EXEC sp_executesql @sql;
DROP TABLE #item_location
DROP TABLE #items
搜索DTO(数据传输对象)@Sona。A和C都是这三个项目的共同点。关系划分总是那么有趣!因为RDBMS中几乎没有用于此的内置运算符。(或者我的技能过时了)他为什么要试试这个?@Sona。我添加了一个dbfiddle来显示它的工作原理。现在检查fiddle@Sona。如果您通过添加WHERE
子句来更改逻辑,那么您应该期望中断代码。这回答了——并且正确地回答了——你提出的问题。如果您还有其他问题,请作为新问题提问。@Sona:Gordon是对的-但更具建设性的是,您的WHERE子句应该添加到两个selects to work中(在HAVING子句的内部和外部)@GordonLinoff对不起,我是堆栈新手,所以不知道它是如何工作的,我刚才给出了一个例子,上面查询的输出是ID\u location键盘鼠标扬声器-----------------------------------A 11 B 0 1 C 1 1 1 D 0 1 0,但我只想要所有items,在当前示例中是AOhh,我理解,您可以使用group by作为ID_位置,使用ORDER by作为comun位置的排名,如果有人想证明其他结果,我将代码复制到SQL fiddle,
CREATE TABLE #items (
ID_item int,
name varchar(20)
)
CREATE TABLE #item_location (
ID_item int,
ID_location char(1)
)
INSERT INTO #items( ID_item, name ) VALUES (1,'Mouse')
INSERT INTO #items( ID_item, name ) VALUES (2,'Keyboard')
INSERT INTO #items( ID_item, name ) VALUES (3,'Speaker')
INSERT INTO #item_location (ID_item, ID_location) VALUES (1,'A')
INSERT INTO #item_location (ID_item, ID_location) VALUES (1,'B')
INSERT INTO #item_location (ID_item, ID_location) VALUES (1,'C')
INSERT INTO #item_location (ID_item, ID_location) VALUES (1,'D')
INSERT INTO #item_location (ID_item, ID_location) VALUES (2,'A')
INSERT INTO #item_location (ID_item, ID_location) VALUES (2,'C')
INSERT INTO #item_location (ID_item, ID_location) VALUES (3,'A')
INSERT INTO #item_location (ID_item, ID_location) VALUES (3,'B')
INSERT INTO #item_location (ID_item, ID_location) VALUES (3,'C')
--SELECT B.ID_location, COUNT(1)
--FROM #items AS A
--INNER JOIN #item_location AS B ON A.ID_item = B.ID_Item
--GROUP BY B.ID_Location;
DECLARE @sql NVARCHAR(max);
DECLARE @columns VARCHAR(200);
SET @columns = STUFF(
(
SELECT
','+ QUOTENAME(LTRIM(name))
FROM
(SELECT DISTINCT
A.name
FROM #items AS A
) AS T
FOR XML PATH('')
), 1, 1, '')
SET @sql = N'
SELECT
*
FROM
(
SELECT ID_location,name
FROM #item_location A INNER JOIN #items B ON B.ID_item = A.ID_item
) AS T
PIVOT
(
count(name)
FOR name IN (' + @columns + N')
) AS P order by ID_location;';
EXEC sp_executesql @sql;
DROP TABLE #item_location
DROP TABLE #items