Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c#或sql中,如何从具有不同条件的同一个表中获取公共数据_C#_Sql - Fatal编程技术网

在c#或sql中,如何从具有不同条件的同一个表中获取公共数据

在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

我有两个表,一个表由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 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