如果其中一行包含特定值,则返回列中具有重复值的行

时间:2016-01-21 21:59:11

标签: sql sql-server-2008-r2

我尝试查询表以确定多次分配值的位置,但其中一个受让人必须等于确定的值。

例如:

EmployeeName  |EmployeeNumber|EmployeeDept|EmployeeBadgeCode|
--------------+--------------+------------+-----------------+
Dante Hicks   |1             |200         |1                  pair A
Randall Graves|5             |201         |2                            no pair
Brody Bruce   |1             |555         |3                  pair A
Banky Edwards |20            |004         |4                  pair B
Gwen Turner   |7             |200         |5
Holden McNeil |20            |450         |1                  pair B  
TS Quint      |5             |105         |10                           no pair

我想返回存在重复EmployeeNumber的所有行的位置,但仅当EmployeeBadgeCode的副本值为1时才返回。

所以我想回归Dante Hicks'和布罗迪布鲁斯'作为一对副本和“银河爱德华兹”。和霍尔登麦克尼尔'作为另一副重复。

'兰德尔格雷夫斯'和' TS Quint'将不会返回,因为它们具有重复的EmployeeNumber,但EmployeeBadeCode值都不等于1.

任何帮助将不胜感激。

感谢。

2 个答案:

答案 0 :(得分:0)

这将返回这两行。如果只有一个EmployeeNumber 1那么它就不会返回任何内容。

SELECT *
FROM YourTable 
WHERE EmployeeNumber =
    (SELECT EmployeeNumber
    FROM YourTable
    WHERE EmployeeNumber = 1
    GROUP BY EmployeeNumber 
    HAVING COUNT(1) > 1)

答案 1 :(得分:0)

<强> SQL Fiddle Demo

e1.[EmployeeName] < e2.[EmployeeName]

这是为了确保你不要试图与自己匹配,也避免反向配对。

SELECT e1.*, e2.*
FROM employee e1
JOIN employee e2
  ON e1.[EmployeeNumber] = e2.[EmployeeNumber]
 AND e1.[EmployeeName] < e2.[EmployeeName]
WHERE 
    e1.EmployeeBadgeCode = 1
or  e2.EmployeeBadgeCode = 1

在此解决方案中,两个雇员都可以1。如果只需要一名员工1

,则需要添加一个附加验证

<强>输出

|  EmployeeName | EmployeeNumber | EmployeeDept | EmployeeBadgeCode |  EmployeeName | EmployeeNumber | EmployeeDept | EmployeeBadgeCode |
|---------------|----------------|--------------|-------------------|---------------|----------------|--------------|-------------------|
|   Brody Bruce |              1 |          555 |                 3 |   Dante Hicks |              1 |          200 |                 1 |
| Banky Edwards |             20 |            4 |                 4 | Holden McNeil |             20 |          450 |                 1 |