2016-05-26 123 views
1

我需要选择同一列名称的数据类型不同的行。SQL Server - 选择一列匹配但其他不匹配的行

这是我的数据集。预计突出显示的行将在结果中。

dataset

我尝试下面的SQL脚本,但它不返回预期的结果

SELECT COLUMN_NAME, DATA_TYPE 
FROM tablecolumns 
WHERE COLUMN_NAME IN (
    SELECT COLUMN_NAME 
    FROM tablecolumns 
    WHERE COLUMN_NAME IN (
     SELECT COLUMN_NAME 
     FROM tablecolumns 
     GROUP BY DATA_TYPE, COLUMN_NAME 
     HAVING count(*) = 1) 
    GROUP BY COLUMN_NAME 
    HAVING count(*) > 1) 
ORDER BY COLUMN_NAME 

下面是SQL小提琴http://sqlfiddle.com/#!3/6e9665/1

回答

1

首先,你可以使用GROUP BY和HAVING取得具有一个以上的数据类型的列名:

SELECT COLUMN_NAME 
FROM tablecolumns 
GROUP BY COLUMN_NAME 
HAVING count(DISTINCT DATA_TYPE) > 1 

然后,您可以显示所有的行,他们的列名中使用其中位于该结果中(..)

SELECT COLUMN_NAME, DATA_TYPE 
FROM tablecolumns 
WHERE COLUMN_NAME IN (
    SELECT COLUMN_NAME 
    FROM tablecolumns 
    Group by COLUMN_NAME 
    HAVING count(DISTINCT DATA_TYPE) > 1 
) 
ORDER BY COLUMN_NAME 

或者使用INNER JOIN

SELECT a.COLUMN_NAME , a.DATA_TYPE 
FROM tablecolumns a 
INNER JOIN (
    SELECT b.COLUMN_NAME 
    FROM tablecolumns b 
    Group by b.COLUMN_NAME 
    HAVING count(DISTINCT b.DATA_TYPE) > 1 
) c ON c.COLUMN_NAME = a.COLUMN_NAME 
ORDER BY a.COLUMN_NAME 
0

链接如果您有SQL Server 2008或更高您可以使用COUNT()窗口函数来实现您要查找的内容:

WITH CTE_DistinctColumnsAndTypes 
AS 
(
    SELECT COLUMN_NAME 
      ,DATA_TYPE 
    FROM tablecolumns 
    GROUP BY COLUMN_NAME, DATA_TYPE 
), 
CTE_ColumnsAndTypeCount 
AS 
(
    SELECT COLUMN_NAME 
      ,DATA_TYPE 
      ,COUNT(DATA_TYPE) OVER (PARTITION BY COLUMN_NAME) AS TypeCount 
    FROM CTE_DistinctColumnsAndTypes 
) 
SELECT COLUMN_NAME 
     ,DATA_TYPE 
FROM CTE_ColumnsAndTypeCount 
WHERE TypeCount > 1