Как получить общие данные из одной таблицы с различными условиями в C # или SQL - PullRequest
2 голосов
/ 06 мая 2019

У меня есть 2 таблицы, одна таблица состоит из элементов, имеющих столбцы itemID, имя

другая таблица - это Местоположение, имеющее столбцы в качестве ItemID, LocationID Каждый предмет может иметь несколько мест Например: у меня есть 3 предмета: мышь, клавиатура, динамик

  • Мышь есть в 4 местах - A, B, C, D
  • Клавиатура есть в 2 местах - A, C
  • Динамик есть в 3 местах - A, B, C

Теперь я хочу иметь код на C # или SQL, который даст мне общие местоположения всех 3 элементов, т. Е. В текущем примере.

Ответы [ 4 ]

3 голосов
/ 06 мая 2019

Я думаю, что вы хотите:

select l.locationid
from locations l
group by l.locationid
having count(*) = (select count(*) from items);

Предполагается, что строки уникальны в locations. В противном случае используйте count(distinct itemid).

Здесь - скрипта db <>, иллюстрирующая его работу.

0 голосов

Вы можете попробовать использовать PIVOT в SQL Server, возможно, он вам подойдет.

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
0 голосов
/ 06 мая 2019
DECLARE @Locations TABLE (
ItemId INT,
Location VARCHAR(5)
)


DECLARE @Items TABLE (
ItemId INT,
Name VARCHAR(50)
)

INSERT INTO @Items (ItemId,Name)VALUES(1,'Mouse')
INSERT INTO @Items (ItemId,Name)VALUES(2,'Keyboard')
INSERT INTO @Items (ItemId,Name)VALUES(3,'Speaker')


INSERT INTO @Locations (ItemId,Location) VALUES(1, 'A')
INSERT INTO @Locations (ItemId,Location) VALUES(1, 'B')
INSERT INTO @Locations (ItemId,Location) VALUES(1, 'C')
INSERT INTO @Locations (ItemId,Location) VALUES(1, 'D')

INSERT INTO @Locations (ItemId,Location) VALUES(2, 'A')
INSERT INTO @Locations (ItemId,Location) VALUES(2, 'C')

INSERT INTO @Locations (ItemId,Location) VALUES(3, 'A')
INSERT INTO @Locations (ItemId,Location) VALUES(3, 'B')
INSERT INTO @Locations (ItemId,Location) VALUES(3, 'C')
INSERT INTO @Locations (ItemId,Location) VALUES(3, 'C')


SELECT List.Location FROM (
SELECT l.Location,l.ItemId
from @Locations l
GROUP by l.Location,l.ItemId) List
GROUP by List.Location
having count(List.Location) = (select count(*) from @Items);

Можете ли вы попробовать это?

0 голосов
/ 06 мая 2019

Попробуйте 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);

Документация

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...