이것이 SQL에서 가능한지 궁금합니다. 두 개의 테이블 A와 B가 있고 테이블 A에서 선택하고 테이블 B에서 조인한다고 가정하십시오.
SELECT a.*, b.* FROM TABLE_A a JOIN TABLE_B b USING (some_id);
테이블 A에 ‘a_id’, ‘name’및 ‘some_id’열이 있고 테이블 B에 ‘b_id’, ‘name’및 ‘some_id’가 있으면 쿼리는 ‘a_id’, ‘name’, ‘some_id’열을 반환합니다. ‘,’b_id ‘,’name ‘,’some_id ‘. 모든 열을 개별적으로 나열하지 않고 테이블 B의 열 이름 앞에 접두어를 넣을 방법이 있습니까? 이것과 동등합니다 :
SELECT a.*, b.b_id as 'b.b_id', b.name as 'b.name', b.some_id as 'b.some_id'
FROM TABLE_A a JOIN TABLE_B b USING (some_id);
그러나 언급했듯이 모든 열을 나열하지 않으면 다음과 같습니다.
SELECT a.*, b.* as 'b.*'
FROM TABLE_A a JOIN TABLE_B b USING (some_id);
기본적으로 “b. *에 의해 반환 된 모든 열 앞에 ‘something”을 붙입니다. ” 이것이 가능합니까, 아니면 운이 없습니까?
도움을 주셔서 감사합니다.
편집 : SELECT *를 사용하지 않는 것에 대한 조언은 유효한 조언이지만 내 상황과 관련이 없으므로 당면 문제를 고수하십시오-접두사 (SQL 쿼리에 지정된 상수)를 모든에 추가 할 수 있습니까? 조인에서 테이블의 열 이름?
편집 : 내 궁극적 인 목표는 조인으로 두 테이블에서 SELECT *를 수행하고 결과 세트에있는 열의 이름, 테이블 A에서 가져온 열 및 가져온 열을 알 수있는 것입니다. 다시, 나는 열을 개별적으로 나열하고 싶지 않고 SELECT *를 수행 할 수 있어야합니다.
답변
두 가지 가능한 상황이 있습니다. 먼저, 데이터베이스에 관계없이 일반적으로 사용할 수있는 SQL 표준이 있는지 알고 싶습니다. 아니 없어. 둘째, 특정 dbms 제품과 관련하여 알고 싶습니다. 그런 다음 식별해야합니다. 그러나 가장 가능성이 높은 대답은 “a.id, b.id”와 같은 것을 다시 얻는다는 것입니다. SQL 식에서 열을 식별하는 방법이기 때문입니다. 그리고 기본값을 확인하는 가장 쉬운 방법은 이러한 쿼리를 제출하고 다시 얻는 것을 보는 것입니다. 예를 들어, 점 앞에 어떤 접두어를 지정하려면 “SELECT * FROM a AS my_alias”를 사용할 수 있습니다.
답변
귀하의 질문에 대한 대답은 아니오 인 것 같지만 사용할 수있는 한 가지 해킹은 더미 테이블을 할당하여 새 테이블을 분리하는 것입니다. Python 또는 PHP와 같은 스크립팅 언어의 열 목록에 대한 결과 집합을 반복하는 경우 특히 효과적입니다.
SELECT '' as table1_dummy, table1.*, '' as table2_dummy, table2.*, '' as table3_dummy, table3.* FROM table1
JOIN table2 ON table2.table1id = table1.id
JOIN table3 ON table3.table1id = table1.id
나는 이것이 당신의 질문에 정확하게 대답하지는 않는다는 것을 알고 있지만, 당신이 코더라면 이것은 중복 된 열 이름으로 테이블을 분리하는 좋은 방법입니다. 이것이 누군가를 돕기를 바랍니다.
답변
나는 이것이 왜 필요한지 완전히 이해합니다. 적어도 나에게는 많은 내부 조인을 포함하여 많은 테이블을 조인해야 할 때 신속한 프로토 타이핑 중에 편리합니다. 두 번째 “joinedtable. *”필드 와일드 카드에서 열 이름이 동일하면 기본 테이블의 필드 값이 결합 가능한 값으로 대체됩니다. 별칭이 여러 번인 테이블 필드를 수동으로 지정해야 할 경우 오류가 발생하기 쉽고 좌절하며 DRY 위반이 발생합니다.
다음은 코드 생성을 통해이를 사용하는 예제와 함께 PHP (WordPress) 함수입니다. 이 예에서는 고급 사용자 정의 필드 필드를 통해 참조 된 관련 워드 프레스 게시물의 필드를 제공하는 사용자 정의 쿼리를 신속하게 생성하는 데 사용됩니다 .
function prefixed_table_fields_wildcard($table, $alias)
{
global $wpdb;
$columns = $wpdb->get_results("SHOW COLUMNS FROM $table", ARRAY_A);
$field_names = array();
foreach ($columns as $column)
{
$field_names[] = $column["Field"];
}
$prefixed = array();
foreach ($field_names as $field_name)
{
$prefixed[] = "`{$alias}`.`{$field_name}` AS `{$alias}.{$field_name}`";
}
return implode(", ", $prefixed);
}
function test_prefixed_table_fields_wildcard()
{
global $wpdb;
$query = "
SELECT
" . prefixed_table_fields_wildcard($wpdb->posts, 'campaigns') . ",
" . prefixed_table_fields_wildcard($wpdb->posts, 'venues') . "
FROM $wpdb->posts AS campaigns
LEFT JOIN $wpdb->postmeta meta1 ON (meta1.meta_key = 'venue' AND campaigns.ID = meta1.post_id)
LEFT JOIN $wpdb->posts venues ON (venues.post_status = 'publish' AND venues.post_type = 'venue' AND venues.ID = meta1.meta_value)
WHERE 1
AND campaigns.post_status = 'publish'
AND campaigns.post_type = 'campaign'
LIMIT 1
";
echo "<pre>$query</pre>";
$posts = $wpdb->get_results($query, OBJECT);
echo "<pre>";
print_r($posts);
echo "</pre>";
}
출력 :
SELECT
`campaigns`.`ID` AS `campaigns.ID`, `campaigns`.`post_author` AS `campaigns.post_author`, `campaigns`.`post_date` AS `campaigns.post_date`, `campaigns`.`post_date_gmt` AS `campaigns.post_date_gmt`, `campaigns`.`post_content` AS `campaigns.post_content`, `campaigns`.`post_title` AS `campaigns.post_title`, `campaigns`.`post_excerpt` AS `campaigns.post_excerpt`, `campaigns`.`post_status` AS `campaigns.post_status`, `campaigns`.`comment_status` AS `campaigns.comment_status`, `campaigns`.`ping_status` AS `campaigns.ping_status`, `campaigns`.`post_password` AS `campaigns.post_password`, `campaigns`.`post_name` AS `campaigns.post_name`, `campaigns`.`to_ping` AS `campaigns.to_ping`, `campaigns`.`pinged` AS `campaigns.pinged`, `campaigns`.`post_modified` AS `campaigns.post_modified`, `campaigns`.`post_modified_gmt` AS `campaigns.post_modified_gmt`, `campaigns`.`post_content_filtered` AS `campaigns.post_content_filtered`, `campaigns`.`post_parent` AS `campaigns.post_parent`, `campaigns`.`guid` AS `campaigns.guid`, `campaigns`.`menu_order` AS `campaigns.menu_order`, `campaigns`.`post_type` AS `campaigns.post_type`, `campaigns`.`post_mime_type` AS `campaigns.post_mime_type`, `campaigns`.`comment_count` AS `campaigns.comment_count`,
`venues`.`ID` AS `venues.ID`, `venues`.`post_author` AS `venues.post_author`, `venues`.`post_date` AS `venues.post_date`, `venues`.`post_date_gmt` AS `venues.post_date_gmt`, `venues`.`post_content` AS `venues.post_content`, `venues`.`post_title` AS `venues.post_title`, `venues`.`post_excerpt` AS `venues.post_excerpt`, `venues`.`post_status` AS `venues.post_status`, `venues`.`comment_status` AS `venues.comment_status`, `venues`.`ping_status` AS `venues.ping_status`, `venues`.`post_password` AS `venues.post_password`, `venues`.`post_name` AS `venues.post_name`, `venues`.`to_ping` AS `venues.to_ping`, `venues`.`pinged` AS `venues.pinged`, `venues`.`post_modified` AS `venues.post_modified`, `venues`.`post_modified_gmt` AS `venues.post_modified_gmt`, `venues`.`post_content_filtered` AS `venues.post_content_filtered`, `venues`.`post_parent` AS `venues.post_parent`, `venues`.`guid` AS `venues.guid`, `venues`.`menu_order` AS `venues.menu_order`, `venues`.`post_type` AS `venues.post_type`, `venues`.`post_mime_type` AS `venues.post_mime_type`, `venues`.`comment_count` AS `venues.comment_count`
FROM wp_posts AS campaigns
LEFT JOIN wp_postmeta meta1 ON (meta1.meta_key = 'venue' AND campaigns.ID = meta1.post_id)
LEFT JOIN wp_posts venues ON (venues.post_status = 'publish' AND venues.post_type = 'venue' AND venues.ID = meta1.meta_value)
WHERE 1
AND campaigns.post_status = 'publish'
AND campaigns.post_type = 'campaign'
LIMIT 1
Array
(
[0] => stdClass Object
(
[campaigns.ID] => 33
[campaigns.post_author] => 2
[campaigns.post_date] => 2012-01-16 19:19:10
[campaigns.post_date_gmt] => 2012-01-16 19:19:10
[campaigns.post_content] => Lorem ipsum
[campaigns.post_title] => Lorem ipsum
[campaigns.post_excerpt] =>
[campaigns.post_status] => publish
[campaigns.comment_status] => closed
[campaigns.ping_status] => closed
[campaigns.post_password] =>
[campaigns.post_name] => lorem-ipsum
[campaigns.to_ping] =>
[campaigns.pinged] =>
[campaigns.post_modified] => 2012-01-16 21:01:55
[campaigns.post_modified_gmt] => 2012-01-16 21:01:55
[campaigns.post_content_filtered] =>
[campaigns.post_parent] => 0
[campaigns.guid] => http://example.com/?p=33
[campaigns.menu_order] => 0
[campaigns.post_type] => campaign
[campaigns.post_mime_type] =>
[campaigns.comment_count] => 0
[venues.ID] => 84
[venues.post_author] => 2
[venues.post_date] => 2012-01-16 20:12:05
[venues.post_date_gmt] => 2012-01-16 20:12:05
[venues.post_content] => Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
[venues.post_title] => Lorem ipsum venue
[venues.post_excerpt] =>
[venues.post_status] => publish
[venues.comment_status] => closed
[venues.ping_status] => closed
[venues.post_password] =>
[venues.post_name] => lorem-ipsum-venue
[venues.to_ping] =>
[venues.pinged] =>
[venues.post_modified] => 2012-01-16 20:53:37
[venues.post_modified_gmt] => 2012-01-16 20:53:37
[venues.post_content_filtered] =>
[venues.post_parent] => 0
[venues.guid] => http://example.com/?p=84
[venues.menu_order] => 0
[venues.post_type] => venue
[venues.post_mime_type] =>
[venues.comment_count] => 0
)
)
답변
내가 아는 유일한 데이터베이스는 PRAGMA full_column_names
and로 구성한 설정에 따라 SQLite PRAGMA short_column_names
입니다. http://www.sqlite.org/pragma.html을 참조 하십시오
그렇지 않으면 쿼리에 열 이름을 입력하기가 너무 어려운 경우 열 이름이 아닌 서수 위치로 결과 집합에서 열을 가져 오는 것이 좋습니다.
이것은 왜 나쁜 습관을 쓰는지에SELECT *
대한 좋은 예입니다. 결국 모든 열 이름을 입력해야하기 때문입니다.
이름이나 위치가 변경 될 수있는 열을 지원해야한다는 것을 알고 있지만 와일드 카드를 사용하면 더 어렵고 어렵지 않습니다.
답변
나는 OP와 같은 종류의 보트에 있습니다 .3 개의 다른 테이블에서 수십 개의 필드가 있습니다. 일부 이름은 같은 이름 (예 : id, name 등)입니다. 각 필드를 나열하고 싶지 않기 때문에 내 솔루션은 이름을 공유하는 필드의 별칭을 지정하고 고유 이름을 가진 필드에 select *를 사용하는 것이 었습니다.
예를 들면 다음과 같습니다.
표 a : id, 이름, field1, field2 …
표 b : 아이디, 이름, field3, field4 …
a.id를 aID로, a.name을 aName으로, a. *, b.id는 bID, b. 이름은 bName, b. * …..
결과에 액세스 할 때이 필드의 별명을 사용하고 “원래”이름은 무시합니다.
어쩌면 가장 좋은 해결책은 아니지만 그것은 나를 위해 작동합니다 …. mysql을 사용합니다.
답변
다른 데이터베이스 제품은 다른 답변을 제공합니다. 그러나 당신이 이것을 아주 멀리 가지고 다니면 스스로 상처를 입게됩니다. 원하는 열을 선택하고 별명을 지정하여 각 열의 ID가 명확하고 결과에서 구별 할 수있는 것이 훨씬 좋습니다.
답변
이 질문은 실제로 매우 유용합니다. 모든 조건을 처리하기 위해 특히주의를 기울이는 소프트웨어 프로그래밍의 모든 명시 적 열만 나열하면됩니다.
디버깅 할 때 또는 특정 프로그래머의 추상 기반 인프라를 변경할 수있는 구현 대신 DBMS를 일일 사무 도구로 사용하려고한다고 상상해보십시오. 많은 SQL을 코딩해야합니다. 이 시나리오는 데이터베이스 변환, 마이그레이션, 관리 등과 같은 모든 곳에서 찾을 수 있습니다. 이러한 SQL의 대부분은 한 번만 실행되고 다시 사용되지 않으며 모든 열 이름은 시간 낭비입니다. 그리고 프로그래머가 사용할 수있는 것은 SQL 발명이 아닙니다.
일반적으로 열 이름이 접두사로 유틸리티 뷰를 작성합니다. 여기 pl / pgsql의 함수가 있습니다. 쉽지는 않지만 다른 프로 시저 언어로 변환 할 수 있습니다.
-- Create alias-view for specific table.
create or replace function mkaview(schema varchar, tab varchar, prefix varchar)
returns table(orig varchar, alias varchar) as $$
declare
qtab varchar;
qview varchar;
qcol varchar;
qacol varchar;
v record;
sql varchar;
len int;
begin
qtab := '"' || schema || '"."' || tab || '"';
qview := '"' || schema || '"."av' || prefix || tab || '"';
sql := 'create view ' || qview || ' as select';
for v in select * from information_schema.columns
where table_schema = schema and table_name = tab
loop
qcol := '"' || v.column_name || '"';
qacol := '"' || prefix || v.column_name || '"';
sql := sql || ' ' || qcol || ' as ' || qacol;
sql := sql || ', ';
return query select qcol::varchar, qacol::varchar;
end loop;
len := length(sql);
sql := left(sql, len - 2); -- trim the trailing ', '.
sql := sql || ' from ' || qtab;
raise info 'Execute SQL: %', sql;
execute sql;
end
$$ language plpgsql;
예 :
-- This will create a view "avp_person" with "p_" prefix to all column names.
select * from mkaview('public', 'person', 'p_');
select * from avp_person;