【问题标题】:How to get common data from same table with different conditions in c# or sql如何在c#或sql中从具有不同条件的同一张表中获取公共数据
【发布时间】:2019-05-06 12:57:22
【问题描述】:

我有 2 个表,一个表由具有列 itemID、名称的项目组成

其他表是具有列为 ItemID、LocationID 的 Location 每个项目可以有多个位置 例如:我有 3 个项目鼠标、键盘、扬声器

  • 鼠标在 4 个位置 - A、B、C、D
  • 键盘位于 2 个位置 - A、C
  • 扬声器位于 3 个位置 - A、B、C

现在我想在 c# 或 sql 中有一个代码,它将为我提供所有 3 个项目的公共位置,即当前示例中的 A。

【问题讨论】:

  • 搜索 DTO(数据传输对象)
  • @Sona 。 . . A 和 C 对所有三个项目都是通用的。
  • 关系分割总是那么有趣!太 bas 在 RDBMS 中几乎没有内置运算符。 (或者我的技能可能已经过时了)

标签: c# sql


【解决方案1】:

我想你想要:

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

这假定locations 中的行是唯一的。否则,请使用count(distinct itemid)

Here 是一个 dbfiddle,说明它可以工作。

【讨论】:

  • @Sona 。 . .我添加了一个 dbfiddle 表明它可以工作。
  • 现在检查小提琴 dbfiddle.uk/…>
  • @Sona 。 . .如果您通过添加WHERE 子句来更改逻辑,那么您应该会破坏代码。这回答 - 并正确回答 - 您提出的问题。如果您还有其他问题,请将其作为问题提出。
  • @Sona : Gordon 是对的 - 但更具建设性的是,您的 WHERE 子句应该添加到两个选择中才能工作(在 HAVING 子句内部和外部)
  • @GordonLinoff 对不起我的错误,我是新手,所以不知道它是如何工作的,我只是举了一个例子
【解决方案2】:

尝试 LINQ 联合:

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);

Documentation

【讨论】:

    【解决方案3】:

    您可以尝试在 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
    

    【讨论】:

    • 上述查询的输出是 ID_location Keyboard Mouse Speaker ----------- ----------- ---------- - ----------- A 1 1 1 B 0 1 1 C 1 1 1 D 0 1 0 但我只想要所有项目的公共位置,在当前示例中是 A
    • 哦,我明白了,您可以使用 group by 作为 ID_location 和 ORDER BY 对公共位置进行排名,如果有人想证明另一个结果,我将我的代码复制到 SQL fiddle,@987654321 @
    【解决方案4】:
    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);
    

    你可以试试这个吗?

    【讨论】:

    • 他为什么要试试这个?
    猜你喜欢
    • 2014-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-11
    相关资源
    最近更新 更多