복붙노트

[SQL] 가입에서 SQL : 그것은 가능한 한 모든 열을 접두사로 '접두사 *.'?

SQL

가입에서 SQL : 그것은 가능한 한 모든 열을 접두사로 '접두사 *.'?

이 SQL에서 할 수 있는지 궁금 하군요. 두 테이블 A와 B가 있고, 당신은이 표 A에 선택하고 테이블 B에 가입 할 말 :

SELECT a.*, b.* FROM TABLE_A a JOIN TABLE_B b USING (some_id);

테이블 A는 열 'A_ID', '이름'과 'SOME_ID'를 가지고 테이블 B가있는 경우, '이름'을 'b_id', 그리고 ', 쿼리,'이름을 '열'A_ID '를 반환합니다 SOME_ID'을 SOME_ID ' ',' ','이름 ',' 'SOME_ID b_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에 의해 반환 된 모든 열 접두사. * '무언가'로"라고합니다. 나는 운이 오전이 가능 나?

당신의 도움에 미리 감사드립니다!

편집 : 등등 * SELECT를 사용하지에 대한 조언이 유효 조언하지만 내 상황에서 관련이없는, 손에서 문제에 그렇게하십시오 스틱 - 그것은에 접두사 (SQL 쿼리에 지정된 상수)를 추가 할 수있는 모든 A의 테이블의 열 이름에 가입?

편집 : 내 궁극적 인 목표는 열을 표 A에서 와서 열을가 와서 내 결과 집합에서 얻을 열 이름에서 조인 두 테이블에 SELECT *를 수행하고 말할 수있을 수있을 것입니다 테이블 B. 다시는, 내가 개별적으로 목록 컬럼에 싶지 않아, 내가 SELECT *을 할 수 있어야합니다.

해결법

  1. ==============================

    1.여기 두 가지 상황을 참조하십시오. 첫째, 당신은 이것에 대한 SQL 표준이있는 경우에 관계없이 데이터베이스의 일반적으로 사용할 수있는, 알고 싶어요. 아니 없어. 둘째, 특정의 DBMS 제품과 관련하여 알고 싶어요. 그럼 당신은 그것을 확인해야합니다. 하지만 가장 가능성있는 대답은 당신이 당신의 SQL 식의 열을 식별해야 거라고 어떻게이기 때문에 "a.id, b.id"같은 것을 다시 얻을 거라고 상상. 그리고 기본이 무엇인지 찾을 수있는 가장 쉬운 방법은, 바로 그러한 쿼리를 입력하고 다시 무엇을 얻을 볼 수 있습니다. 당신이 접두사는 점 앞에 오는을 지정하려는 경우, 당신은 사용할 수 있습니다 예를 들어, "A와의 my_alias SELECT * FROM".

    여기 두 가지 상황을 참조하십시오. 첫째, 당신은 이것에 대한 SQL 표준이있는 경우에 관계없이 데이터베이스의 일반적으로 사용할 수있는, 알고 싶어요. 아니 없어. 둘째, 특정의 DBMS 제품과 관련하여 알고 싶어요. 그럼 당신은 그것을 확인해야합니다. 하지만 가장 가능성있는 대답은 당신이 당신의 SQL 식의 열을 식별해야 거라고 어떻게이기 때문에 "a.id, b.id"같은 것을 다시 얻을 거라고 상상. 그리고 기본이 무엇인지 찾을 수있는 가장 쉬운 방법은, 바로 그러한 쿼리를 입력하고 다시 무엇을 얻을 볼 수 있습니다. 당신이 접두사는 점 앞에 오는을 지정하려는 경우, 당신은 사용할 수 있습니다 예를 들어, "A와의 my_alias SELECT * FROM".

  2. ==============================

    2.이 질문에 대한 대답은 그러나 당신이 사용할 수있는 해킹 한 각 새 테이블을 분리하는 더미 열을 할당하는 것입니다, 어떤이다 보인다. 당신은 파이썬이나 PHP와 같은 스크립트 언어의 열 목록에 대한 결과 집합을 통해 반복하는 경우에 특히 잘 작동합니다.

    이 질문에 대한 대답은 그러나 당신이 사용할 수있는 해킹 한 각 새 테이블을 분리하는 더미 열을 할당하는 것입니다, 어떤이다 보인다. 당신은 파이썬이나 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
    

    나는이 정확하게 귀하의 질문에 대답하지 않습니다 실현,하지만 당신이 있다면이 부호화기 중복 열 이름을 가진 별도의 테이블에 좋은 방법입니다. 이 사람을 도움이되기를 바랍니다.

  3. ==============================

    3.이 필요한 이유를 완전히 이해 - 많은 내부 조인을 포함 합류하는 데 필요한 테이블이 많이있을 때 나를 위해 적어도 그것은 빠른 프로토 타이핑시 편리합니다. 즉시 열 이름이 두 번째에서 동일로 "joinedtable. *"필드에 와일드 카드는 기본 테이블의 필드 값은 joinedtable 값을 오버라이드 (override)합니다. 수동으로 반복 별칭 테이블의 필드를 지정하지 때 발생하기 쉬운, 좌절과 DRY의 위반 오류 ...

    이 필요한 이유를 완전히 이해 - 많은 내부 조인을 포함 합류하는 데 필요한 테이블이 많이있을 때 나를 위해 적어도 그것은 빠른 프로토 타이핑시 편리합니다. 즉시 열 이름이 두 번째에서 동일로 "joinedtable. *"필드에 와일드 카드는 기본 테이블의 필드 값은 joinedtable 값을 오버라이드 (override)합니다. 수동으로 반복 별칭 테이블의 필드를 지정하지 때 발생하기 쉬운, 좌절과 DRY의 위반 오류 ...

    여기에 사용하는 방법의 일례로 부호 생성 함께 통해이를 달성하기 PHP (워드 프레스) 함수이다. 예에서, 빠르게 고급 사용자 정의 필드 필드를 통해 참조 된 관련 워드 프레스 포스트의 필드를 제공하는 사용자 지정 쿼리를 생성하는 데 사용됩니다.

    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
            )
    )
    
  4. ==============================

    4.유일한 데이터베이스는 그이 당신이 PRAGMA의 full_column_names 및 PRAGMA의 short_column_names로 구성 설정에 따라, SQLite는 것이다 않습니다 알고있다. http://www.sqlite.org/pragma.html 참조

    유일한 데이터베이스는 그이 당신이 PRAGMA의 full_column_names 및 PRAGMA의 short_column_names로 구성 설정에 따라, SQLite는 것이다 않습니다 알고있다. http://www.sqlite.org/pragma.html 참조

    그렇지 않으면 내가 추천 할 수있는 것은 당신이 당신의 쿼리에서 열 이름을 입력 할 너무 많은 문제가 있다면, 서수 위치하여 결과 집합이 아닌 열 이름으로 열을 가져올 것입니다.

    결국 어쨌든 모든 열 이름을 입력 할 필요가있는 것이기 때문에 - 이것은 SELECT *를 사용하는 나쁜 관행이 이유의 좋은 예입니다.

    나는 이름이나 위치를 변경할 수 있습니다 지원 컬럼의 필요성을 이해하지만 와일드 카드를 사용하는 것을 어려워하지 쉬워집니다.

  5. ==============================

    5.나는 OP와 같은 보트의 종류입니다 - 내가 (. 즉, ID, 이름, 등) 같은 이름을 가진 일부는 내가 참여하고있어 것을 3 개 개의 다른 테이블에서 필드의 수십, 수 있습니다. 내 솔루션은 별칭 이름을 공유하고 고유 한 이름을 가지고 그 사람들을 위해 선택 *을 사용하여 해당 필드에 있었다, 그래서 각 필드를 나열하고 싶지 않아요.

    나는 OP와 같은 보트의 종류입니다 - 내가 (. 즉, ID, 이름, 등) 같은 이름을 가진 일부는 내가 참여하고있어 것을 3 개 개의 다른 테이블에서 필드의 수십, 수 있습니다. 내 솔루션은 별칭 이름을 공유하고 고유 한 이름을 가지고 그 사람들을 위해 선택 *을 사용하여 해당 필드에 있었다, 그래서 각 필드를 나열하고 싶지 않아요.

    예를 들면 :

    표 A : 신분증, 이름, 필드 1, FIELD2 ...

    표 B : 신분증, 이름, FIELD3, 입력란 4 ...

    원조, aName로 a.name, A와 a.id 선택합니다. * 입찰가 BNAME 같은 b.name, B로 b.id. * .....

    이 분야에 대한 결과 나는 우리 별칭 이름을 액세스하고 "원래"이름을 무시합니다.

    어쩌면 최선의 해결책하지만 나를 위해 작동합니다 .... 내가 사용 mysql을 해요

  6. ==============================

    6.다른 데이터베이스 제품은 당신에게 다른 대답을 줄 것이다; 당신은 매우 여기까지 수행하지만 만약 당신이 상처 자신을 설정하고 있습니다. 당신은 훨씬 더 당신이 원하는 열을 선택하고, 각 컬럼의 신원이 선명한 그래서 그들에게 자신의 별칭을주는 길 이죠, 당신은 결과에 떨어져 그들에게 말할 수 있습니다.

    다른 데이터베이스 제품은 당신에게 다른 대답을 줄 것이다; 당신은 매우 여기까지 수행하지만 만약 당신이 상처 자신을 설정하고 있습니다. 당신은 훨씬 더 당신이 원하는 열을 선택하고, 각 컬럼의 신원이 선명한 그래서 그들에게 자신의 별칭을주는 길 이죠, 당신은 결과에 떨어져 그들에게 말할 수 있습니다.

  7. ==============================

    7.이 질문은 실제로 매우 유용하다. 그것은 당신이 모든 조건에 대처주의 특정 지불 소프트웨어 프로그래밍에 모든 명시 적으로 열을 나열하기 만합니다.

    이 질문은 실제로 매우 유용하다. 그것은 당신이 모든 조건에 대처주의 특정 지불 소프트웨어 프로그래밍에 모든 명시 적으로 열을 나열하기 만합니다.

    특정 프로그래머의 추상 기본 인프라의 어떤 변경 가능한 구현, 우리는 코드에 SQL을 많이 필요 대신, 매일 사무실 도구로 DBMS를 사용하려고 디버깅 할 때 상상, 또는. 시나리오는이 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;
    
  8. ==============================

    8.난 완전히 중복 된 필드 이름에 대한 문제를 이해합니다.

    난 완전히 중복 된 필드 이름에 대한 문제를 이해합니다.

    나는 그것을 해결하기 위해 내 자신의 기능을 코딩 할 때까지 나도이 필요했습니다. 당신이 PHP를 사용하는 경우 당신은 그것을 사용하거나 언어 코드 당신은 당신이 다음과 같은 시설이있는 경우에 사용된다.

    여기에 트릭은 새로운 배열을 혼합 할 수 있도록이 mysql_num_fields ()를 가지고있는 경우 mysql_field_table ()는 결과의 각 행에 대해 테이블 ​​이름과 mysql_field_name () 분야를 반환한다는 것입니다.

    이 모든 열을 접두사)

    문안 인사,

    function mysql_rows_with_columns($query) {
        $result = mysql_query($query);
        if (!$result) return false; // mysql_error() could be used outside
        $fields = mysql_num_fields($result);
        $rows = array();
        while ($row = mysql_fetch_row($result)) { 
            $newRow = array();
            for ($i=0; $i<$fields; $i++) {
                $table = mysql_field_table($result, $i);
                $name = mysql_field_name($result, $i);
                $newRow[$table . "." . $name] = $row[$i];
            }
            $rows[] = $newRow;
        }
        mysql_free_result($result);
        return $rows;
    }
    
  9. ==============================

    9.이에 대한 SQL 표준은 없다.

    이에 대한 SQL 표준은 없다.

    그러나 코드 생성으로 (두 테이블을 만들거나 런타임에 변경되거나 수요에), 당신은 아주 쉽게이 작업을 수행 할 수 있습니다

    CREATE TABLE [dbo].[stackoverflow_329931_a](
        [id] [int] IDENTITY(1,1) NOT NULL,
        [col2] [nchar](10) NULL,
        [col3] [nchar](10) NULL,
        [col4] [nchar](10) NULL,
     CONSTRAINT [PK_stackoverflow_329931_a] PRIMARY KEY CLUSTERED 
    (
        [id] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    
    CREATE TABLE [dbo].[stackoverflow_329931_b](
        [id] [int] IDENTITY(1,1) NOT NULL,
        [col2] [nchar](10) NULL,
        [col3] [nchar](10) NULL,
        [col4] [nchar](10) NULL,
     CONSTRAINT [PK_stackoverflow_329931_b] PRIMARY KEY CLUSTERED 
    (
        [id] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    
    DECLARE @table1_name AS varchar(255)
    DECLARE @table1_prefix AS varchar(255)
    DECLARE @table2_name AS varchar(255)
    DECLARE @table2_prefix AS varchar(255)
    DECLARE @join_condition AS varchar(255)
    SET @table1_name = 'stackoverflow_329931_a'
    SET @table1_prefix = 'a_'
    SET @table2_name = 'stackoverflow_329931_b'
    SET @table2_prefix = 'b_'
    SET @join_condition = 'a.[id] = b.[id]'
    
    DECLARE @CRLF AS varchar(2)
    SET @CRLF = CHAR(13) + CHAR(10)
    
    DECLARE @a_columnlist AS varchar(MAX)
    DECLARE @b_columnlist AS varchar(MAX)
    DECLARE @sql AS varchar(MAX)
    
    SELECT @a_columnlist = COALESCE(@a_columnlist + @CRLF + ',', '') + 'a.[' + COLUMN_NAME + '] AS [' + @table1_prefix + COLUMN_NAME + ']'
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME = @table1_name
    ORDER BY ORDINAL_POSITION
    
    SELECT @b_columnlist = COALESCE(@b_columnlist + @CRLF + ',', '') + 'b.[' + COLUMN_NAME + '] AS [' + @table2_prefix + COLUMN_NAME + ']'
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME = @table2_name
    ORDER BY ORDINAL_POSITION
    
    SET @sql = 'SELECT ' + @a_columnlist + '
    ,' + @b_columnlist + '
    FROM [' + @table1_name + '] AS a
    INNER JOIN [' + @table2_name + '] AS b
    ON (' + @join_condition + ')'
    
    PRINT @sql
    -- EXEC (@sql)
    
  10. ==============================

    10.이 재사용 가능한 방법으로 일어날 수 있도록 내가 생각할 수있는 두 가지 방법이 있습니다. 하나는 그들이에서 온 테이블의 접두사로 모든 ​​열 이름을 변경하는 것입니다. 나는이 여러 번 봐 왔지만, 정말 좋아하지 않는다. 나는 그것의 중복은, 타이핑을 많이 일으키는 것을 발견하고는 불분명 기원을 갖는 열 이름의 경우를 충당하기 위해 필요로 할 때 당신은 항상 별칭을 사용할 수 있습니다.

    이 재사용 가능한 방법으로 일어날 수 있도록 내가 생각할 수있는 두 가지 방법이 있습니다. 하나는 그들이에서 온 테이블의 접두사로 모든 ​​열 이름을 변경하는 것입니다. 나는이 여러 번 봐 왔지만, 정말 좋아하지 않는다. 나는 그것의 중복은, 타이핑을 많이 일으키는 것을 발견하고는 불분명 기원을 갖는 열 이름의 경우를 충당하기 위해 필요로 할 때 당신은 항상 별칭을 사용할 수 있습니다.

    나는 당신이를 통해보고하기 위해 최선을 다하고 있습니다 경우에 당신이 상황에서 할 것이 좋습니다 다른 방법은, 각 테이블 즉 별칭 테이블 이름에 대한 뷰를 생성하는 것입니다. 그럼 당신은 그 전망이 아닌 테이블에 가입 할 수 있습니다. 그런 식으로, 당신이 원하는 경우에 당신은 당신이 원하는 경우 원래 열 이름으로 원래의 테이블을 사용하여 무료로 * 무료로 사용할 수 있으며, 이미 뷰의 이름 변경 작업을 수행했기 때문에 그것은 또한 쉽게 후속 쿼리를 작성합니다.

    당신은 각 열에서 온 어떤 테이블 알아야하는 이유 마지막으로, 나는 명확하지 않다. 이 문제합니까? 궁극적으로 어떤 중요한 것은 여기에 포함 된 데이터입니다. 여부 사용자 ID는 사용자 테이블에서 나온 또는 UserQuestion 테이블은 정말 중요하지 않습니다. 당신이 그것을 업데이트해야 할 때, 물론 중요하지만, 그 시점에서 당신은 이미를 결정할 충분히 스키마를 알고 있어야합니다.

  11. ==============================

    11.아니면 탭 버튼의 클릭으로 열 목록으로 SELECT *를 확장 프롬프트 레드 게이트 SQL 팩터 또는 SQL을 사용할 수 있습니다

    아니면 탭 버튼의 클릭으로 열 목록으로 SELECT *를 확장 프롬프트 레드 게이트 SQL 팩터 또는 SQL을 사용할 수 있습니다

    그래서 귀하의 경우, 당신은 B를 조인 SELECT * FROM 입력하면 ... * 탭 버튼, 짜잔의 끝으로 이동! 당신은 볼 수 SELECT A.column1, A.column2는, ...., A로부터 B.column1, B.column2 B는 가입

    그것은 비록 무료 아니에요

  12. ==============================

    12.앨리어싱없이 이렇게 질수, 어떻게 그 필드는 합류하는 2 ~ 3 테이블에 존재하는 경우, where 절에서 필드를 참조 할거야 간단하기 때문에? 당신이 참조하려고하는 일이 MySQL을위한 명확 할 것이다.

    앨리어싱없이 이렇게 질수, 어떻게 그 필드는 합류하는 2 ~ 3 테이블에 존재하는 경우, where 절에서 필드를 참조 할거야 간단하기 때문에? 당신이 참조하려고하는 일이 MySQL을위한 명확 할 것이다.

  13. ==============================

    13.나는 관련된 테이블의 필드 이름을 변경하여 내 비슷한 문제를 해결했다. 예,이 일의 특권을 가졌다 그 모두가 그것을 가지고하지 않을 수 있습니다 알고 있습니다. 나는 테이블 이름을 나타내는 테이블 내에서 각 필드에 접두사를 추가했다. 따라서 SQL은 변경되지 것 OP에 의해 게시 -

    나는 관련된 테이블의 필드 이름을 변경하여 내 비슷한 문제를 해결했다. 예,이 일의 특권을 가졌다 그 모두가 그것을 가지고하지 않을 수 있습니다 알고 있습니다. 나는 테이블 이름을 나타내는 테이블 내에서 각 필드에 접두사를 추가했다. 따라서 SQL은 변경되지 것 OP에 의해 게시 -

    SELECT a.*, b.* FROM TABLE_A a JOIN TABLE_B b USING (some_id);
    

    여전히 예상 된 결과를 제공 - 용이성을 출력 필드가 속한 테이블을 식별하는.

  14. ==============================

    14.새 열이 매우 자주 일반적으로 휴식은 매우 미묘한 방식으로 SELECT * 테이블에 변경 추가 또는 열 순서 얻을하는 경향이, * 일반적으로 나쁜 코드를 만드는 선택합니다. 열을 나열 그래서 적합한 솔루션이다.

    새 열이 매우 자주 일반적으로 휴식은 매우 미묘한 방식으로 SELECT * 테이블에 변경 추가 또는 열 순서 얻을하는 경향이, * 일반적으로 나쁜 코드를 만드는 선택합니다. 열을 나열 그래서 적합한 솔루션이다.

    MySQL의에 대한하지만 당신은 선택 조항을 만들 동적 SYSCOLUMNS에서 열 이름을 선택하고 수 SQLSERVER에서하지 않도록, 쿼리를 수행하는 방법에 관해서는.

  15. ==============================

    15.스키마에 대해 우려하는 경우이 힘 작업을 변경합니다 : 1. 실행과 관련된 모든 테이블에 '테이블을 DESCRIBE'쿼리. 2. 반환 된 필드 이름을 동적으로 선택된 별명 접두사 열 이름의 문자열을 구축하기.

    스키마에 대해 우려하는 경우이 힘 작업을 변경합니다 : 1. 실행과 관련된 모든 테이블에 '테이블을 DESCRIBE'쿼리. 2. 반환 된 필드 이름을 동적으로 선택된 별명 접두사 열 이름의 문자열을 구축하기.

  16. ==============================

    16.MySQL의 C-API를 사용하는 사람들에 대한 귀하의 질문에 직접 대답이있다.

    MySQL의 C-API를 사용하는 사람들에 대한 귀하의 질문에 직접 대답이있다.

    SQL을 감안할 때 :

      SELECT a.*, b.*, c.* FROM table_a a JOIN table_b b USING (x) JOIN table_c c USING (y)
    

    'mysql_stmt_result_metadata ()'의 결과는 구조 MYSQL_FIELD로 준비된 SQL 쿼리에서 필드의 정의를 제공합니다 []. 각 필드는 다음과 같은 데이터를 포함 :

      char *name;                 /* Name of column (may be the alias) */
      char *org_name;             /* Original column name, if an alias */
      char *table;                /* Table of column if column was a field */
      char *org_table;            /* Org table name, if table was an alias */
      char *db;                   /* Database for table */
      char *catalog;              /* Catalog for table */
      char *def;                  /* Default value (set by mysql_list_fields) */
      unsigned long length;       /* Width of column (create length) */
      unsigned long max_length;   /* Max width for selected set */
      unsigned int name_length;
      unsigned int org_name_length;
      unsigned int table_length;
      unsigned int org_table_length;
      unsigned int db_length;
      unsigned int catalog_length;
      unsigned int def_length;
      unsigned int flags;         /* Div flags */
      unsigned int decimals;      /* Number of decimals in field */
      unsigned int charsetnr;     /* Character set */
      enum enum_field_types type; /* Type of field. See mysql_com.h for types */
    

    통지 필드를 가지고 : 카탈로그, 테이블, ORG_NAME을

    당신은 지금 어떤 (카탈로그 일명) 스키마와 테이블에 속한 사용자 SQL에있는 필드 알고있다. 이것은 일반적으로 별칭 아무것도하지 않고, 다중 테이블 SQL 쿼리에서 각 필드를 식별하는 데 충분하다.

    실제 제품은 SQLyog에 PK 필드가 존재들은 독립적 멀티 테이블의 각 테이블을 갱신 할 수있는 가입되도록 매너,이 실제 데이터를 사용하여 표시된다.

  17. ==============================

    17.이 솔루션에서 개발이 내가 문제를 접근 할 방법입니다

    이 솔루션에서 개발이 내가 문제를 접근 할 방법입니다

    먼저 모든 AS 문 목록을 작성 :

    DECLARE @asStatements varchar(8000)
    
    SELECT @asStatements = ISNULL(@asStatements + ', ','') + QUOTENAME(table_name) + '.' + QUOTENAME(column_name) + ' AS ' + '[' + table_name + '.' + column_name + ']'
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME = 'TABLE_A' OR TABLE_NAME = 'TABLE_B'
    ORDER BY ORDINAL_POSITION
    

    그런 다음 쿼리에서 사용 :

    EXEC('SELECT ' + @asStatements + ' FROM TABLE_A a JOIN TABLE_B b USING (some_id)');
    

    그러나,이 힘의 필요성 수정 유사한은 SQL 서버에서 테스트되기 때문이다. 사용이 지원되지 않기 때문에하지만이 코드는 정확히 SQL 서버에서 작동하지 않습니다.

    테스트 할 수있는 경우 코멘트 / 예를 들어,이 코드를 수정하십시오 MySQL은.

  18. ==============================

    18.최근 NodeJS와 포스트 그레스에서이 문제를 다 퉜다.

    최근 NodeJS와 포스트 그레스에서이 문제를 다 퉜다.

    ES6 접근

    어떤 RDBMS는이 기능을 제공의 내 모든 필드, 예컨대을 포함하는 객체를 생성, 그래서 나는 알고있다 특징되지 않습니다 :

    const schema = { columns: ['id','another_column','yet_another_column'] }
    

    테이블 이름과 함께 문자열을 연결하는 감속기를 정의 :

    const prefix = (table, columns) => columns.reduce((previous, column) => {
      previous.push(table + '.' + column + ' AS ' + table + '_' + column);
      return previous;
    }, []);
    

    이 문자열의 배열을 반환합니다. 각 테이블을 호출하고 결과를 결합 :

    const columns_joined = [...prefix('tab1',schema.columns), ...prefix('tab2',schema.columns)];
    

    출력 최종 SQL 문 :

    console.log('SELECT ' + columns_joined.join(',') + ' FROM tab1, tab2 WHERE tab1.id = tab2.id');
    
  19. ==============================

    19.I는 노드 또는 센티넬 더미 컬럼을 사용하여 제안 응답에 기초하여 솔루션을 구현 하였다. 당신은 같은 SQL을 생성하여 사용합니다 :

    I는 노드 또는 센티넬 더미 컬럼을 사용하여 제안 응답에 기초하여 솔루션을 구현 하였다. 당신은 같은 SQL을 생성하여 사용합니다 :

    select 
        s.*
      , '' as _prefix__creator_
      , u.*
      , '' as _prefix__speaker_
      , p.*
    from statements s 
      left join users u on s.creator_user_id = u.user_id
      left join persons p on s.speaker_person_id = p.person_id
    

    그리고 후 처리는 addPrefixes (행)처럼 다시 데이터베이스 드라이버에서 얻을 행을.

    구현 (내 드라이버에 의해 반환 된 필드 / 행을 기반으로하지만, 다른 DB 드라이버의 변화에 ​​쉽게해야합니다) :

    const PREFIX_INDICATOR = '_prefix__'
    const STOP_PREFIX_INDICATOR = '_stop_prefix'
    
    /** Adds a <prefix> to all properties that follow a property with the name: PREFIX_INDICATOR<prefix> */
    function addPrefixes(fields, row) {
      let prefix = null
      for (const field of fields) {
        const key = field.name
        if (key.startsWith(PREFIX_INDICATOR)) {
          if (row[key] !== '') {
            throw new Error(`PREFIX_INDICATOR ${PREFIX_INDICATOR} must not appear with a value, but had value: ${row[key]}`)
          }
          prefix = key.substr(PREFIX_INDICATOR.length)
          delete row[key]
        } else if (key === STOP_PREFIX_INDICATOR) {
          if (row[key] !== '') {
            throw new Error(`STOP_PREFIX_INDICATOR ${STOP_PREFIX_INDICATOR} must not appear with a value, but had value: ${row[key]}`)
          }
          prefix = null
          delete row[key]
        } else if (prefix) {
          const prefixedKey = prefix + key
          row[prefixedKey] = row[key]
          delete row[key]
        }
      }
      return row
    }
    

    테스트:

    const {
      addPrefixes,
      PREFIX_INDICATOR,
      STOP_PREFIX_INDICATOR,
    } = require('./BaseDao')
    
    describe('addPrefixes', () => {
      test('adds prefixes', () => {
        const fields = [
          {name: 'id'},
          {name: PREFIX_INDICATOR + 'my_prefix_'},
          {name: 'foo'},
          {name: STOP_PREFIX_INDICATOR},
          {name: 'baz'},
        ]
        const row = {
          id: 1,
          [PREFIX_INDICATOR + 'my_prefix_']: '',
          foo: 'bar',
          [STOP_PREFIX_INDICATOR]: '',
          baz: 'spaz'
        }
        const expected = {
          id: 1,
          my_prefix_foo: 'bar',
          baz: 'spaz',
        }
        expect(addPrefixes(fields, row)).toEqual(expected)
      })
    })
    
  20. ==============================

    20.내가 뭘하는 절차를 연결하는 Excel을 사용하는 것입니다. 예를 들어, 첫 번째 내가 선택 * 및 모든 열을 얻을, 엑셀에 붙여 넣습니다. 그런 다음 열을 둘러싸 코드 I의 필요성을 작성합니다. 내가 열 무리에 광고 이전에 필요한 말. 난은 A 열에서 내 필드를 가지고 거라고 열 C에서 다시 열 B 내 분야에서 "prev_으로". 열 D에서 나는 열이있을 것이다.

    내가 뭘하는 절차를 연결하는 Excel을 사용하는 것입니다. 예를 들어, 첫 번째 내가 선택 * 및 모든 열을 얻을, 엑셀에 붙여 넣습니다. 그런 다음 열을 둘러싸 코드 I의 필요성을 작성합니다. 내가 열 무리에 광고 이전에 필요한 말. 난은 A 열에서 내 필드를 가지고 거라고 열 C에서 다시 열 B 내 분야에서 "prev_으로". 열 D에서 나는 열이있을 것이다.

    그런 다음 열 전자의 concatanate를 사용하고 공백을 포함하도록 확인하고, 함께 병합 할 수 있습니다. 그런 다음 절단하고 SQL 코드에이 붙여 넣습니다. 나는 또한 내가 multihundred 필드 테이블의 각 필드에 대해 할 필요가 같은 필드와 다른 이상 코드에 대한 case 문을 만들기 위해이 방법을 사용했습니다.

  21. ==============================

    21.포스트 그레스, 나는 대신 객체를 JSON 반환하는 JSON 기능을 사용 .... 다음 질의 후, 나는 _json 접미사 필드를 json_decode.

    포스트 그레스, 나는 대신 객체를 JSON 반환하는 JSON 기능을 사용 .... 다음 질의 후, 나는 _json 접미사 필드를 json_decode.

    IE :

    select row_to_json(tab1.*),tab1_json, row_to_json(tab2.*) tab2_json 
     from tab1
     join tab2 on tab2.t1id=tab1.id
    

    그들은 또한 접미사를 제거합니다 ( "_json"접미사가있는 경우 다음 PHP (또는 다른 언어), 반환 된 열 및 json_decode (를 통해 I 루프) 그들. 결국, 나는 모든 포함 "TAB1"라는 개체를 얻을 TAB1 필드 및 모든 TAB2 필드를 포함하는 다른 소위 "TAB2".

  22. ==============================

    22.PHP 7.2 + MySQL은 / ​​Mariadb

    PHP 7.2 + MySQL은 / ​​Mariadb

    MySQL은 같은 이름을 가진 당신에게 여러 필드를 보내드립니다. 심지어 터미널 클라이언트입니다. 당신이 연관 배열을 원하는 경우에, 당신은 키를 직접 확인해야합니다.

    덕분에 원래 위해 @axelbrz합니다. 나는 새로운 PHP로 포팅하고 그것을 조금 청소했습니다 :

    function mysqli_rows_with_columns($link, $query) {
        $result = mysqli_query($link, $query);
        if (!$result) {
            return mysqli_error($link);
        }
        $field_count = mysqli_num_fields($result);
        $fields = array();
        for ($i = 0; $i < $field_count; $i++) {
            $field = mysqli_fetch_field_direct($result, $i);
            $fields[] = $field->table . '.' . $field->name; # changed by AS
            #$fields[] = $field->orgtable . '.' . $field->orgname; # actual table/field names
        }
        $rows = array();
        while ($row = mysqli_fetch_row($result)) {
            $new_row = array();
            for ($i = 0; $i < $field_count; $i++) {
                $new_row[$fields[$i]] = $row[$i];
            }
            $rows[] = $new_row;
        }
        mysqli_free_result($result);
        return $rows;
    }
    
    $link = mysqli_connect('localhost', 'fixme', 'fixme', 'fixme');
    print_r(mysqli_rows_with_columns($link, 'select foo.*, bar.* from foo, bar'));
    
  23. from https://stackoverflow.com/questions/329931/sql-select-join-is-it-possible-to-prefix-all-columns-as-prefix by cc-by-sa and MIT license