SQL Server子查询无法正常工作

时间:2016-03-16 12:37:34

标签: sql sql-server

SELECT * FROM table1 
WHERE Year(dateColumn) = 2015;

只要{1}位于table1中,这对我有用。但是,我在master_table中有该列。所以我在努力:

dateColumn

我也尝试过:

SELECT * FROM table1 
WHERE Year(SELECT dateColumnName FROM master_table mt WHERE mt.table_id = table1.id) = 2015;

我的master_table是一个表列表,SELECT * FROM table1 WHERE Year(dateColumnName FROM master_table mt WHERE mt.table_id = table1.id) = 2015; 字段有文字字符串值dateColumnName,我将在table1中使用它。原因是我必须通过这种方式,有些表的列名为dateColumn,有些表有dateColumn,所有表都存储在master_table中。

总结:我希望第二个date_column语句返回SELECTdateColumn,具体取决于主表中的值并取决于WHERE条件,并将其用于我的第一个date_column声明。

示例数据:

表1

SELECT id Name Email

dateColumn 1 John abc@xyz.co

表2

2013-01-15 id Name Email

date_column 2 Paul def@xyz.co

master_table

2014-03-05 table_id

dateColumnName 1

dateColumn 2

我需要根据日期过滤table1和table2中的数据,为此我需要列名。这些列名存储在master_table中,因此我通过匹配存储在master_table中的table_id来匹配它们的id,并使用第二个date_column语句检索列名

2 个答案:

答案 0 :(得分:0)

您没有子查询,您的参数以select开头。括号用于函数,而不是子查询。

子查询的语法将包含额外的括号:

SELECT *
FROM table1 
WHERE Year( (SELECT dateColumnName FROM master_table mt WHERE condition) ) = 2015;

更自然的方法是使用exists或简单的相等:

SELECT *
FROM table1 
WHERE 2015 = (SELECT YEAR(dateColumnName) FROM master_table mt WHERE condition);

请注意,这不需要额外的括号,因为没有功能。

答案 1 :(得分:0)

您真正想要的是一个JOIN查询:

select id, datefld, email from
(
select
  mt.table_id as id,
    case mt.dateColumnName
        when 'dateColumn' then t1.`name`
        when 'date_column' then t2.`name`
    end as name, 
    case mt.dateColumnName
        when 'dateColumn' then t1.dateColumn
        when 'date_column' then t2.date_column
    end as datefld,
    case mt.dateColumnName
        when 'dateColumn' then t1.email
        when 'date_column' then t2.email
    end as email 
from
  master_table mt
left join
  table1 t1 on t1.id=mt.table_id
left join
  table2 t2 on t2.id=mt.table_id
) a
where Year(a.datefld)=2014

我更新了SQL,并在http://sqlfiddle.com/#!9/9b9ce/1

为它做了一个sqlfiddler