Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server-选择一列匹配但另一列不匹配的行_Sql Server - Fatal编程技术网

Sql server SQL Server-选择一列匹配但另一列不匹配的行

Sql server SQL Server-选择一列匹配但另一列不匹配的行,sql-server,Sql Server,我需要为相同的列名选择数据类型不同的行 这是我的数据集。高亮显示的行应包含在结果中 我尝试了以下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

我需要为相同的列名选择数据类型不同的行

这是我的数据集。高亮显示的行应包含在结果中

我尝试了以下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 FIDLE的链接

如果您使用的是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

首先,您可以使用GROUP BY和HAVING获得具有多个数据类型的列名:

SELECT COLUMN_NAME
FROM tablecolumns
GROUP BY COLUMN_NAME
HAVING count(DISTINCT DATA_TYPE) > 1
然后,您可以使用where IN(..)显示结果中列名称所在的所有行

或者使用内部连接

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