mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-19 14:11:58 +00:00
Merge remote-tracking branch 'upstream/master' into fix25
This commit is contained in:
commit
d01212f41c
@ -0,0 +1,46 @@
|
|||||||
|
join_use_nulls = 1
|
||||||
|
1 1
|
||||||
|
2 2
|
||||||
|
-
|
||||||
|
1 1
|
||||||
|
-
|
||||||
|
1 1 1 1
|
||||||
|
-
|
||||||
|
1 1
|
||||||
|
2 2
|
||||||
|
-
|
||||||
|
-
|
||||||
|
-
|
||||||
|
1 1 1 1
|
||||||
|
-
|
||||||
|
-
|
||||||
|
-
|
||||||
|
-
|
||||||
|
-
|
||||||
|
join_use_nulls = 0
|
||||||
|
1 1
|
||||||
|
2 2
|
||||||
|
-
|
||||||
|
1 1
|
||||||
|
-
|
||||||
|
1 1 1 1
|
||||||
|
-
|
||||||
|
1 1
|
||||||
|
2 2
|
||||||
|
-
|
||||||
|
1 1 1 1
|
||||||
|
2 2 0 0
|
||||||
|
-
|
||||||
|
1 1 1 1
|
||||||
|
2 2 0 0
|
||||||
|
-
|
||||||
|
1 1 1 1
|
||||||
|
-
|
||||||
|
-
|
||||||
|
-
|
||||||
|
1 1 0 0
|
||||||
|
2 2 0 0
|
||||||
|
-
|
||||||
|
1 1 1 1
|
||||||
|
2 2 0 0
|
||||||
|
-
|
@ -0,0 +1,64 @@
|
|||||||
|
drop table if exists t;
|
||||||
|
drop table if exists s;
|
||||||
|
|
||||||
|
create table t(a Int64, b Int64) engine = Memory;
|
||||||
|
create table s(a Int64, b Int64) engine = Memory;
|
||||||
|
|
||||||
|
insert into t values(1,1);
|
||||||
|
insert into t values(2,2);
|
||||||
|
insert into s values(1,1);
|
||||||
|
|
||||||
|
select 'join_use_nulls = 1';
|
||||||
|
set join_use_nulls = 1;
|
||||||
|
select * from t left outer join s using (a,b) order by t.a;
|
||||||
|
select '-';
|
||||||
|
select * from t join s using (a,b);
|
||||||
|
select '-';
|
||||||
|
select * from t join s on (t.a=s.a and t.b=s.b);
|
||||||
|
select '-';
|
||||||
|
select t.* from t left join s on (t.a=s.a and t.b=s.b) order by t.a;
|
||||||
|
select '-';
|
||||||
|
-- select t.*, s.* from t left join s on (t.a=s.a and t.b=s.b); -- TODO
|
||||||
|
select '-';
|
||||||
|
-- select t.*, s.* from t left join s on (s.a=t.a and t.b=s.b); -- TODO
|
||||||
|
select '-';
|
||||||
|
select t.*, s.* from t right join s on (t.a=s.a and t.b=s.b);
|
||||||
|
select '-';
|
||||||
|
-- select * from t left outer join s using (a,b) where s.a is null; -- TODO
|
||||||
|
select '-';
|
||||||
|
-- select * from t left outer join s on (t.a=s.a and t.b=s.b) where s.a is null; -- TODO
|
||||||
|
select '-';
|
||||||
|
-- select t.*, s.* from t left join s on (s.a=t.a and t.b=s.b and t.a=toInt64(2)) order by t.a; -- TODO
|
||||||
|
select '-';
|
||||||
|
-- select t.*, s.* from t left join s on (s.a=t.a); -- TODO
|
||||||
|
select '-';
|
||||||
|
select t.*, s.* from t left join s on (t.b=toInt64(2) and s.a=t.a) where s.b=2;
|
||||||
|
|
||||||
|
select 'join_use_nulls = 0';
|
||||||
|
set join_use_nulls = 0;
|
||||||
|
select * from t left outer join s using (a,b) order by t.a;
|
||||||
|
select '-';
|
||||||
|
select * from t join s using (a,b);
|
||||||
|
select '-';
|
||||||
|
select * from t join s on (t.a=s.a and t.b=s.b);
|
||||||
|
select '-';
|
||||||
|
select t.* from t left join s on (t.a=s.a and t.b=s.b) order by t.a;
|
||||||
|
select '-';
|
||||||
|
select t.*, s.* from t left join s on (t.a=s.a and t.b=s.b) order by t.a;
|
||||||
|
select '-';
|
||||||
|
select t.*, s.* from t left join s on (s.a=t.a and t.b=s.b) order by t.a;
|
||||||
|
select '-';
|
||||||
|
select t.*, s.* from t right join s on (t.a=s.a and t.b=s.b);
|
||||||
|
select '-';
|
||||||
|
-- select * from t left outer join s using (a,b) where s.a is null; -- TODO
|
||||||
|
select '-';
|
||||||
|
-- select * from t left outer join s on (t.a=s.a and t.b=s.b) where s.a is null; -- TODO
|
||||||
|
select '-';
|
||||||
|
select t.*, s.* from t left join s on (s.a=t.a and t.b=s.b and t.a=toInt64(2)) order by t.a;
|
||||||
|
select '-';
|
||||||
|
select t.*, s.* from t left join s on (s.a=t.a) order by t.a;
|
||||||
|
select '-';
|
||||||
|
select t.*, s.* from t left join s on (t.b=toInt64(2) and s.a=t.a) where s.b=2;
|
||||||
|
|
||||||
|
drop table t;
|
||||||
|
drop table s;
|
@ -0,0 +1,11 @@
|
|||||||
|
<Trace>
|
||||||
|
.
|
||||||
|
<Debug>
|
||||||
|
.
|
||||||
|
<Information>
|
||||||
|
.
|
||||||
|
<Error>
|
||||||
|
-
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
20
dbms/tests/queries/0_stateless/00965_logs_level_bugfix.sh
Executable file
20
dbms/tests/queries/0_stateless/00965_logs_level_bugfix.sh
Executable file
@ -0,0 +1,20 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
|
||||||
|
. $CURDIR/../shell_config.sh
|
||||||
|
|
||||||
|
$CLICKHOUSE_BINARY client --send_logs_level="trace" --query="SELECT 1" 2>&1 | awk '{ print $8 }' | grep "Trace" | head -n 1
|
||||||
|
echo "."
|
||||||
|
$CLICKHOUSE_BINARY client --send_logs_level="debug" --query="SELECT 1" 2>&1 | awk '{ print $8 }' | grep "Debug" | head -n 1
|
||||||
|
echo "."
|
||||||
|
$CLICKHOUSE_BINARY client --send_logs_level="information" --query="SELECT 1" 2>&1 | awk '{ print $8 }' | grep "Information" | head -n 1
|
||||||
|
echo "."
|
||||||
|
$CLICKHOUSE_BINARY client --send_logs_level="error" --query="SELECT throwIf(1)" 2>&1 | awk '{ print $8 }' | grep "Error" | head -n 1
|
||||||
|
echo "-"
|
||||||
|
$CLICKHOUSE_BINARY client --send_logs_level="debug" --query="SELECT 1" 2>&1 | awk '{ print $8 }' | grep "Trace" | head -n 1
|
||||||
|
echo "."
|
||||||
|
$CLICKHOUSE_BINARY client --send_logs_level="information" --query="SELECT 1" 2>&1 | awk '{ print $8 }' | grep "Debug\|Trace" | head -n 1
|
||||||
|
echo "."
|
||||||
|
$CLICKHOUSE_BINARY client --send_logs_level="error" --query="SELECT throwIf(1)" 2>&1 | awk '{ print $8 }' | grep "Debug\|Trace\|Information" | head -n 1
|
||||||
|
echo "."
|
||||||
|
$CLICKHOUSE_BINARY client --send_logs_level="None" --query="SELECT throwIf(1)" 2>&1 | awk '{ print $8 }' | grep "Debug\|Trace\|Information\|Error" | head -n 1
|
@ -1,24 +0,0 @@
|
|||||||
1
|
|
||||||
1
|
|
||||||
1
|
|
||||||
1
|
|
||||||
1
|
|
||||||
1
|
|
||||||
<Debug>
|
|
||||||
<Trace>
|
|
||||||
<Debug>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<Information>
|
|
||||||
<Debug>
|
|
||||||
<Debug>
|
|
||||||
<Debug>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<Information>
|
|
||||||
<Debug>
|
|
||||||
<Information>
|
|
@ -1,17 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
|
|
||||||
. $CURDIR/../shell_config.sh
|
|
||||||
|
|
||||||
> 00965_logs_level_bugfix.tmp
|
|
||||||
|
|
||||||
clickhouse-client --send_logs_level="trace" --query="SELECT 1;" 2>> 00965_logs_level_bugfix.tmp
|
|
||||||
clickhouse-client --send_logs_level="debug" --query="SELECT 1;" 2>> 00965_logs_level_bugfix.tmp
|
|
||||||
clickhouse-client --send_logs_level="information" --query="SELECT 1;" 2>> 00965_logs_level_bugfix.tmp
|
|
||||||
clickhouse-client --send_logs_level="warning" --query="SELECT 1;" 2>> 00965_logs_level_bugfix.tmp
|
|
||||||
clickhouse-client --send_logs_level="error" --query="SELECT 1;" 2>> 00965_logs_level_bugfix.tmp
|
|
||||||
clickhouse-client --send_logs_level="none" --query="SELECT 1;" 2>> 00965_logs_level_bugfix.tmp
|
|
||||||
|
|
||||||
awk '{ print $8 }' 00965_logs_level_bugfix.tmp
|
|
||||||
|
|
||||||
|
|
@ -1,12 +0,0 @@
|
|||||||
<Debug>
|
|
||||||
<Trace>
|
|
||||||
<Debug>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<Information>
|
|
||||||
<Debug>
|
|
||||||
*****
|
|
||||||
<Information>
|
|
@ -1,17 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
|
|
||||||
. $CURDIR/../shell_config.sh
|
|
||||||
|
|
||||||
> 00965_send_logs_level_concurrent_queries_first.tmp
|
|
||||||
> 00965_send_logs_level_concurrent_queries_second.tmp
|
|
||||||
|
|
||||||
clickhouse-client --send_logs_level="trace" --query="SELECT * from numbers(100000);" >> /dev/null 2>> 00965_send_logs_level_concurrent_queries_first.tmp &
|
|
||||||
clickhouse-client --send_logs_level="information" --query="SELECT * from numbers(100000);" >> /dev/null 2>> 00965_send_logs_level_concurrent_queries_second.tmp
|
|
||||||
|
|
||||||
sleep 2
|
|
||||||
|
|
||||||
awk '{ print $8 }' 00965_send_logs_level_concurrent_queries_first.tmp
|
|
||||||
echo "*****"
|
|
||||||
awk '{ print $8 }' 00965_send_logs_level_concurrent_queries_second.tmp
|
|
||||||
|
|
11
dbms/tests/queries/0_stateless/00965_send_logs_level_concurrent_queries.sh
Executable file
11
dbms/tests/queries/0_stateless/00965_send_logs_level_concurrent_queries.sh
Executable file
@ -0,0 +1,11 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
|
||||||
|
. $CURDIR/../shell_config.sh
|
||||||
|
|
||||||
|
for i in {1..10}; do
|
||||||
|
$CLICKHOUSE_BINARY client --send_logs_level="trace" --query="SELECT * from numbers(1000000);" > /dev/null 2> /dev/null &
|
||||||
|
$CLICKHOUSE_BINARY client --send_logs_level="information" --query="SELECT * from numbers(1000000);" 2>&1 | awk '{ print $8 }' | grep "Debug\|Trace" &
|
||||||
|
done
|
||||||
|
|
||||||
|
wait
|
@ -209,7 +209,7 @@ Possible values:
|
|||||||
- 0 — Disabled.
|
- 0 — Disabled.
|
||||||
- 1 — Enabled.
|
- 1 — Enabled.
|
||||||
|
|
||||||
Default value: 0.
|
Default value: 1.
|
||||||
|
|
||||||
## input_format_skip_unknown_fields {#settings-input_format_skip_unknown_fields}
|
## input_format_skip_unknown_fields {#settings-input_format_skip_unknown_fields}
|
||||||
|
|
||||||
@ -306,8 +306,8 @@ Default value: `ALL`.
|
|||||||
|
|
||||||
Changes behavior of join operations with `ANY` strictness.
|
Changes behavior of join operations with `ANY` strictness.
|
||||||
|
|
||||||
!!! note "Attention"
|
!!! warning "Attention"
|
||||||
This setting applies only for the [Join](../table_engines/join.md) table engine.
|
This setting applies only for `JOIN` operations with [Join](../table_engines/join.md) engine tables.
|
||||||
|
|
||||||
Possible values:
|
Possible values:
|
||||||
|
|
||||||
@ -336,7 +336,7 @@ Default value: 0.
|
|||||||
|
|
||||||
## join_any_take_last_row {#settings-join_any_take_last_row}
|
## join_any_take_last_row {#settings-join_any_take_last_row}
|
||||||
|
|
||||||
Changes the behavior of `ANY JOIN`. When disabled, `ANY JOIN` takes the first row found for a key. When enabled, `ANY JOIN` takes the last matched row, if there are multiple rows for the same key. The setting is used only in [Join table engine](../table_engines/join.md).
|
Changes the behavior of `ANY JOIN`. When disabled, `ANY JOIN` takes the first row found for a key. When enabled, `ANY JOIN` takes the last matched row if there are multiple rows for the same key. The setting is used only in [Join table engine](../table_engines/join.md).
|
||||||
|
|
||||||
Possible values:
|
Possible values:
|
||||||
|
|
||||||
|
@ -537,13 +537,25 @@ ClickHouse doesn't directly support syntax with commas, so we don't recommend us
|
|||||||
|
|
||||||
#### Strictness {#select-join-strictness}
|
#### Strictness {#select-join-strictness}
|
||||||
|
|
||||||
- `ALL` — If the right table has several matching rows, ClickHouse creates a [Cartesian product](https://en.wikipedia.org/wiki/Cartesian_product) from matching rows. This is the normal `JOIN` behavior for standard SQL.
|
- `ALL` — If the right table has several matching rows, ClickHouse creates a [Cartesian product](https://en.wikipedia.org/wiki/Cartesian_product) from matching rows. This is the standard `JOIN` behavior in SQL.
|
||||||
- `ANY` — If the right table has several matching rows, only the first one found is joined. If the right table has only one matching row, the results of queries with `ANY` and `ALL` keywords are the same.
|
- `ANY` — If the right table has several matching rows, only the first one found is joined. If the right table has only one matching row, the results of queries with `ANY` and `ALL` keywords are the same.
|
||||||
- `ASOF` — For joining sequences with a non-exact match. Usage of `ASOF JOIN` is described below.
|
- `ASOF` — For joining sequences with a non-exact match. `ASOF JOIN` usage is described below.
|
||||||
|
|
||||||
**ASOF JOIN Usage**
|
**ASOF JOIN Usage**
|
||||||
|
|
||||||
`ASOF JOIN` is useful when you need to join records that have no exact match. For example, consider the following tables:
|
`ASOF JOIN` is useful when you need to join records that have no exact match.
|
||||||
|
|
||||||
|
Tables for `ASOF JOIN` must have an ordered sequence column. This column cannot be alone in a table, and should be one of the data types: `UInt32`, `UInt64`, `Float32`, `Float64`, `Date`, and `DateTime`.
|
||||||
|
|
||||||
|
Use the following syntax for `ASOF JOIN`:
|
||||||
|
|
||||||
|
```
|
||||||
|
SELECT expression_list FROM table_1 ASOF JOIN table_2 USING(equi_column1, ... equi_columnN, asof_column)
|
||||||
|
```
|
||||||
|
|
||||||
|
`ASOF JOIN` uses `equi_columnX` for joining on equality (`user_id` in our example) and `asof_column` for joining on the closest match.
|
||||||
|
|
||||||
|
For example, consider the following tables:
|
||||||
|
|
||||||
```
|
```
|
||||||
table_1 table_2
|
table_1 table_2
|
||||||
@ -556,22 +568,13 @@ event_1_2 | 13:00 | 42 event_2_3 | 13:00 | 42
|
|||||||
... ...
|
... ...
|
||||||
```
|
```
|
||||||
|
|
||||||
`ASOF JOIN` takes the timestamp of a user event from `table_1` and finds in `table_2` an event, which timestamp is closest (equal or less) to the timestamp of the event from `table_1`. In our example, `event_1_1` can be joined with the `event_2_1`, `event_1_2` can be joined with `event_2_3`, `event_2_2` cannot be joined.
|
`ASOF JOIN` takes the timestamp of a user event from `table_1` and finds an event in `table_2` where the timestamp is closest (equal or less) to the timestamp of the event from `table_1`. Herewith the `user_id` column is used for joining on equality and the `ev_time` column is used for joining on the closest match.
|
||||||
|
In our example, `event_1_1` can be joined with `event_2_1`, `event_1_2` can be joined with `event_2_3`, but `event_2_2` cannot be joined.
|
||||||
Tables for `ASOF JOIN` must have the ordered sequence column. This column cannot be alone in a table. You can use `UInt32`, `UInt64`, `Float32`, `Float64`, `Date` and `DateTime` data types for this column.
|
|
||||||
|
|
||||||
Use the following syntax for `ASOF JOIN`:
|
|
||||||
|
|
||||||
```
|
|
||||||
SELECT expression_list FROM table_1 ASOF JOIN table_2 USING(equi_column1, ... equi_columnN, asof_column)
|
|
||||||
```
|
|
||||||
|
|
||||||
`ASOF JOIN` uses `equi_columnX` for joining on equality (`user_id` in our example) and `asof_column` for joining on the closest match.
|
|
||||||
|
|
||||||
Implementation details:
|
Implementation details:
|
||||||
|
|
||||||
- The `asof_column` should be the last in the `USING` clause.
|
- `asof_column` should be last in the `USING` clause.
|
||||||
- The `ASOF` join is not supported in the [Join](../operations/table_engines/join.md) table engine.
|
- `ASOF` join is not supported in the [Join](../operations/table_engines/join.md) table engine.
|
||||||
|
|
||||||
To set the default strictness value, use the session configuration parameter [join_default_strictness](../operations/settings/settings.md#settings-join_default_strictness).
|
To set the default strictness value, use the session configuration parameter [join_default_strictness](../operations/settings/settings.md#settings-join_default_strictness).
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@ ClickHouse применяет настройку в тех случаях, ко
|
|||||||
- 0 — выключена.
|
- 0 — выключена.
|
||||||
- 1 — включена.
|
- 1 — включена.
|
||||||
|
|
||||||
Значение по умолчанию: 1.
|
Значение по умолчанию — 1.
|
||||||
|
|
||||||
**Использование**
|
**Использование**
|
||||||
|
|
||||||
@ -87,7 +87,7 @@ ClickHouse применяет настройку в тех случаях, ко
|
|||||||
- 0 — выключена.
|
- 0 — выключена.
|
||||||
- 1 — включена.
|
- 1 — включена.
|
||||||
|
|
||||||
Значение по умолчанию: 0.
|
Значение по умолчанию — 0.
|
||||||
|
|
||||||
## http_zlib_compression_level {#settings-http_zlib_compression_level}
|
## http_zlib_compression_level {#settings-http_zlib_compression_level}
|
||||||
|
|
||||||
@ -108,7 +108,7 @@ ClickHouse применяет настройку в тех случаях, ко
|
|||||||
- 0 — выключена.
|
- 0 — выключена.
|
||||||
- 1 — включена.
|
- 1 — включена.
|
||||||
|
|
||||||
Значение по умолчанию: 0.
|
Значение по умолчанию — 0.
|
||||||
|
|
||||||
## send_progress_in_http_headers {#settings-send_progress_in_http_headers}
|
## send_progress_in_http_headers {#settings-send_progress_in_http_headers}
|
||||||
|
|
||||||
@ -121,7 +121,7 @@ ClickHouse применяет настройку в тех случаях, ко
|
|||||||
- 0 — выключена.
|
- 0 — выключена.
|
||||||
- 1 — включена.
|
- 1 — включена.
|
||||||
|
|
||||||
Значение по умолчанию: 0.
|
Значение по умолчанию — 0.
|
||||||
|
|
||||||
## input_format_allow_errors_num
|
## input_format_allow_errors_num
|
||||||
|
|
||||||
@ -209,7 +209,7 @@ Ok.
|
|||||||
- 0 — выключена.
|
- 0 — выключена.
|
||||||
- 1 — включена.
|
- 1 — включена.
|
||||||
|
|
||||||
Значение по умолчанию: 0.
|
Значение по умолчанию — 1.
|
||||||
|
|
||||||
## input_format_skip_unknown_fields {#settings-input_format_skip_unknown_fields}
|
## input_format_skip_unknown_fields {#settings-input_format_skip_unknown_fields}
|
||||||
|
|
||||||
@ -259,7 +259,27 @@ Ok.
|
|||||||
- `ANY` — если в правой таблице несколько соответствующих строк, то соединяется только первая найденная. Если в "правой" таблице есть не более одной подходящей строки, то результаты `ANY` и `ALL` совпадают.
|
- `ANY` — если в правой таблице несколько соответствующих строк, то соединяется только первая найденная. Если в "правой" таблице есть не более одной подходящей строки, то результаты `ANY` и `ALL` совпадают.
|
||||||
- `Пустая строка` — если `ALL` или `ANY` не указаны в запросе, то ClickHouse генерирует исключение.
|
- `Пустая строка` — если `ALL` или `ANY` не указаны в запросе, то ClickHouse генерирует исключение.
|
||||||
|
|
||||||
**Значение по умолчанию**: `ALL`
|
Значение по умолчанию — `ALL`.
|
||||||
|
|
||||||
|
## join_any_take_last_row {#settings-join_any_take_last_row}
|
||||||
|
|
||||||
|
Изменяет поведение операций, выполняемых со строгостью `ANY`.
|
||||||
|
|
||||||
|
!!! warning "Внимание"
|
||||||
|
Настройка применяется только для операций `JOIN`, выполняемых над таблицами с движком [Join](../table_engines/join.md).
|
||||||
|
|
||||||
|
Возможные значения:
|
||||||
|
|
||||||
|
- 0 — если в правой таблице несколько соответствующих строк, то присоединяется только первая найденная строка.
|
||||||
|
- 1 — если в правой таблице несколько соответствующих строк, то присоединяется только последняя найденная строка.
|
||||||
|
|
||||||
|
Значение по умолчанию — 0.
|
||||||
|
|
||||||
|
**Смотрите также**
|
||||||
|
|
||||||
|
- [Секция JOIN](../../query_language/select.md#select-join)
|
||||||
|
- [Движок таблиц Join](../table_engines/join.md)
|
||||||
|
- [join_default_strictness](#settings-join_default_strictness)
|
||||||
|
|
||||||
## join_use_nulls {#settings-join_use_nulls}
|
## join_use_nulls {#settings-join_use_nulls}
|
||||||
|
|
||||||
@ -694,4 +714,3 @@ load_balancing = first_or_random
|
|||||||
- [Множественный JOIN](../../query_language/select.md#select-join)
|
- [Множественный JOIN](../../query_language/select.md#select-join)
|
||||||
|
|
||||||
[Оригинальная статья](https://clickhouse.yandex/docs/ru/operations/settings/settings/) <!--hide-->
|
[Оригинальная статья](https://clickhouse.yandex/docs/ru/operations/settings/settings/) <!--hide-->
|
||||||
|
|
||||||
|
@ -538,14 +538,49 @@ SELECT * FROM t1, t2, t3 WHERE t1.a = t2.a AND t1.a = t3.a
|
|||||||
|
|
||||||
ClickHouse не поддерживает синтаксис с запятыми напрямую и мы не рекомендуем его использовать. Алгоритм пытается переписать запрос с помощью секций `CROSS JOIN` и `INNER JOIN` и затем продолжает его выполнение. При переписывании запроса, ClickHouse пытается оптимизировать производительность и потребление памяти. По умолчанию, ClickHouse трактует запятые как `INNER JOIN` и конвертирует их в `CROSS JOIN` когда не может гарантировать, что `INNER JOIN` возвращает запрошенные данные.
|
ClickHouse не поддерживает синтаксис с запятыми напрямую и мы не рекомендуем его использовать. Алгоритм пытается переписать запрос с помощью секций `CROSS JOIN` и `INNER JOIN` и затем продолжает его выполнение. При переписывании запроса, ClickHouse пытается оптимизировать производительность и потребление памяти. По умолчанию, ClickHouse трактует запятые как `INNER JOIN` и конвертирует их в `CROSS JOIN` когда не может гарантировать, что `INNER JOIN` возвращает запрошенные данные.
|
||||||
|
|
||||||
#### ANY или ALL - строгость:
|
#### Строгость {#select-join-strictness}
|
||||||
|
|
||||||
Если указано `ALL`, то при наличии в "правой" таблице нескольких соответствующих строк, данные будут размножены по количеству этих строк. Это нормальное поведение `JOIN` как в стандартном SQL.
|
- `ALL` — если правая таблица содержит несколько подходящих строк, то ClickHouse выполняет их [декартово произведение](https://ru.wikipedia.org/wiki/Прямое_произведение). Это стандартное поведение `JOIN` в SQL.
|
||||||
Если указано `ANY`, то при наличии в "правой" таблице нескольких соответствующих строк, будет присоединена только первая попавшаяся. Если известно, что в "правой" таблице есть не более одной подходящей строки, то результаты `ANY` и `ALL` совпадают.
|
- `ANY` — если в правой таблице несколько соответствующих строк, то присоединяется только первая найденная. Если в правой таблице есть только одна подходящая строка, то результаты `ANY` и `ALL` совпадают.
|
||||||
|
- `ASOF` — для объединения последовательностей с нечётким совпадением. `ASOF JOIN` описан ниже по тексту.
|
||||||
|
|
||||||
|
**Использование ASOF JOIN**
|
||||||
|
|
||||||
|
`ASOF JOIN` применим в том случае, когда необходимо объединять записи, которые не имеют точного совпадения.
|
||||||
|
|
||||||
|
Таблицы для `ASOF JOIN` должны иметь столбец с отсортированной последовательностью. Этот столбец не может быть единственным в таблице и должен быть одного из типов: `UInt32`, `UInt64`, `Float32`, `Float64`, `Date` и `DateTime`.
|
||||||
|
|
||||||
|
Синтаксис `ASOF JOIN`:
|
||||||
|
|
||||||
|
```
|
||||||
|
SELECT expression_list FROM table_1 ASOF JOIN table_2 USING(equi_column1, ... equi_columnN, asof_column)
|
||||||
|
```
|
||||||
|
|
||||||
|
`ASOF JOIN` использует `equi_columnX` для объединения по равенству и `asof_column` для объединения по ближайшему совпадению.
|
||||||
|
|
||||||
|
Например, рассмотрим следующие таблицы:
|
||||||
|
|
||||||
|
```
|
||||||
|
table_1 table_2
|
||||||
|
event | ev_time | user_id event | ev_time | user_id
|
||||||
|
----------|---------|---------- ----------|---------|----------
|
||||||
|
... ...
|
||||||
|
event_1_1 | 12:00 | 42 event_2_1 | 11:59 | 42
|
||||||
|
... event_2_2 | 12:30 | 42
|
||||||
|
event_1_2 | 13:00 | 42 event_2_3 | 13:00 | 42
|
||||||
|
... ...
|
||||||
|
```
|
||||||
|
|
||||||
|
`ASOF JOIN` принимает метку времени пользовательского события из `table_1` и находит такое событие в `table_2` метка времени которого наиболее близка (равна или меньше) к метке времени события из `table_1`. При этом столбец `user_id` используется для объединения по равенству, а столбец `ev_time` для объединения по ближайшему совпадению. В нашем примере `event_1_1` может быть объединено с `event_2_1`, `event_1_2` может быть объединено с `event_2_3`, а `event_2_2` не объединяется.
|
||||||
|
|
||||||
|
Детали реализации:
|
||||||
|
|
||||||
|
- `asof_column` должен быть последним в секции `USING`.
|
||||||
|
- `ASOF JOIN` не поддержан для движка таблиц [Join](../operations/table_engines/join.md).
|
||||||
|
|
||||||
Чтобы задать значение строгости по умолчанию, используйте сессионный параметр [join_default_strictness](../operations/settings/settings.md#settings-join_default_strictness).
|
Чтобы задать значение строгости по умолчанию, используйте сессионный параметр [join_default_strictness](../operations/settings/settings.md#settings-join_default_strictness).
|
||||||
|
|
||||||
**GLOBAL JOIN**
|
#### GLOBAL JOIN
|
||||||
|
|
||||||
При использовании обычного `JOIN` , запрос отправляется на удалённые серверы. На каждом из них выполняются подзапросы для формирования "правой" таблицы, и с этой таблицей выполняется соединение. То есть, "правая" таблица формируется на каждом сервере отдельно.
|
При использовании обычного `JOIN` , запрос отправляется на удалённые серверы. На каждом из них выполняются подзапросы для формирования "правой" таблицы, и с этой таблицей выполняется соединение. То есть, "правая" таблица формируется на каждом сервере отдельно.
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user