Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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
Mysql 我需要帮助解决这个问题_Mysql_Sql Server - Fatal编程技术网

Mysql 我需要帮助解决这个问题

Mysql 我需要帮助解决这个问题,mysql,sql-server,Mysql,Sql Server,假设我有一个有两列的表。实际上,它将位于两个不同的表中,但为了简化,让我们使用一个表。我只是想知道我如何处理这个问题 A | B ------------------------ 2016-01 | 2015-00 2016-02 | 2015-01 2017-01 | 2017-01 2018-00 | 2018-01 如何编写一个选择列a并将其与列B进行比较的查询 我想要 2016-01对应于2015-01 2016-02至2015-01

假设我有一个有两列的表。实际上,它将位于两个不同的表中,但为了简化,让我们使用一个表。我只是想知道我如何处理这个问题

     A   |     B
------------------------
 2016-01 |  2015-00
 2016-02 |  2015-01 
 2017-01 |  2017-01
 2018-00 |  2018-01    
如何编写一个选择列
a
并将其与列
B
进行比较的查询

我想要

  • 2016-01
    对应于
    2015-01
  • 2016-02
    2015-01
  • 2017-01
    2017-01
  • 2018-00
    2017-01
    (因为
    2018-00
    小于
    2018-01
如何确保列
A
仅从列
B
中选择一个值,其中列
A
大于列
B

我试着写一个查询

SELECT A FROM TB1 WHERE '1016-01' >= (SELECT MAX(B) FROM TB1)
但是这个查询不起作用,因为
max(b)
将始终返回'2017-01

使用两个不同的表

SELECT A.Col, B.Col
FROM A JOIN B ON A.Col >= B.Col

在SQL Server中,您可以使用如下内容:

;WITH cte AS (
    SELECT *
    FROM (VALUES
    ('2016-01'),('2016-02'),('2017-01'),('2018-00')
    ) as t(A)
), cte1 AS (
    SELECT *
    FROM (VALUES
    ('2015-00'),('2015-01'),('2017-01'),('2018-01')
    ) as t(B)
)

SELECT  c.A,
        t.B 
FROM cte c
CROSS APPLY (
    SELECT TOP 1 B
    FROM cte1
    WHERE CAST(REPLACE(c.A,'-','') as int) >= CAST(REPLACE(B,'-','') as int)
    ORDER BY B DESC
    ) t
将输出:

A       B
2016-01 2015-01
2016-02 2015-01
2017-01 2017-01
2018-00 2017-01

我们的想法是将
-
替换为零,生成像
201501
这样的值,然后将它们作为
int
值进行比较。

这是一个自连接:
从foo左侧选择*在foo.a>bar.B上连接foo作为bar。假设的问题和真实的问题完全不同。你为什么不按实际情况写出来呢。两个表。假设A列在表A中,B列在表B中。我考虑过交叉连接,但我有数百万条记录,这可能不起作用……它们只有一个表。为什么要使用交叉连接,然后将其转换为内部连接?@SeanLange My bad。。你说得对。此外,实际问题与问题对应的两个表有关