#mysql #sql-server
#mysql #sql-сервер
Вопрос:
Допустим, у меня есть таблица с двумя столбцами. На самом деле это будет в двух разных таблицах, но для упрощения давайте использовать одну таблицу. Я просто хочу знать, как я могу решить эту проблему
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
Комментарии:
1. это самосоединение:
select * from foo left join foo AS bar on foo.A > bar.B
2. Гипотетическая проблема и реальная проблема совершенно разные.
3. Почему бы вам не написать это так, как оно есть на самом деле. Две таблицы.
4. предположим, что столбец A находится в таблице A, а столбец B — в таблице B. Я думал о перекрестном соединении , но у меня миллионы записей , и это может не сработать ….
Ответ №1:
В 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
Идея состоит в том, чтобы заменить -
на nothing, чтобы сделать значения похожими 201501
, а затем сравнить их как int
значения.
Ответ №2:
Используйте 2 разные таблицы
SELECT A.Col, B.Col
FROM A JOIN B ON A.Col >= B.Col
Комментарии:
1. У них есть только 1 таблица. И почему вы используете перекрестное соединение, а затем превращаете его во внутреннее соединение?
2. @SeanLange Мой плохой .. вы правы в объединении. Кроме того, фактическая проблема связана с 2 таблицами в соответствии с вопросом