SQL:查询以标识一个表中关联行的实例

时间:2011-10-24 06:59:16

标签: sql sql-server tsql sql-server-2008

我在编写查询时遇到了一些麻烦。

例如:

假设我只有一个包含以下值的表:

    Items
+-----+--------+
| ID  |  NAME  |
+-----+--------+
| A1  | Item_1 |
| A1  | Item_2 |
| A1  | Item_3 |
| A2  | Item_1 |
| A2  | Item_2 |
| A3  | Item_1 |
+-----+--------+

由此,我想识别与多个ID相关联的所有项目名称以及相关的ID名称。

鉴于此示例,输出将为 -

+----+--------+
| ID |  Name  |
+----+--------+
| A1 | Item_1 |
| A2 | Item_1 |
| A3 | Item_1 |
| A1 | Item_2 |
| A2 | Item_2 |
+----+--------+

将排除Item_3,因为只有一个实例,与A3相关联。

我正在使用SQL Server 2008.提前感谢!

3 个答案:

答案 0 :(得分:1)

使用

SELECT * FROM MyTable A WHERE A.Name IN
(SELECT T.Name FROM MyTable T GROUP BY T.Name HAVING COUNT(DISTINCT T.ID) > 1)
ORDER BY A.Name, A.ID

答案 1 :(得分:0)

试试这个

SELECT id,name
FROM Table1
where name in ( select name from(
select name,count(name) as cnt from table1
group by name)
where cnt>1)

此查询是在MS Access / Oracle中编写的,尝试转换为SQL。我不知道那些语法。

我将从最内层的查询中解释逻辑 首先,您将获取大于计数1的名称 然后,您将选择所需的ID和名称。

以上最简单的形式如下

SELECT id,name
FROM Table1 
where name in (
  select name as cnt from table1
  group by name
  having count(name)>1)

答案 2 :(得分:0)

您可以使用窗口聚合:

WITH Counted AS (
  SELECT
    ID,
    NAME,
    IDCount = COUNT(*) OVER (PARTITION BY NAME)
  FROM atable
)
SELECT
  ID,
  NAME
FROM Counted
WHERE IDCount > 1

参考文献: