在PostgreSQL中是否可以在表和函数之间进行连接?

时间:2015-06-23 12:09:33

标签: sql postgresql

我有一张名为Cars的表格 以及一个名为PartsPerCar

的函数

caridpartid之间存在无直接链接。链接虽然是中间的3个表。我确实有一个名为PartsPerCar的函数,它获取carid(它通过中间的表格进行修改)并返回与partid相关的所有carid

例如:如果我选择carid=125,我可以致电PartsPerCar(125)并获取:

part id    part name
10          Wheel A
12          Wheel D
13          Glass F

我最想得到的是获取所有汽车及其所有部件的清单。

类似的东西:

  Car ID ,   Part ID , Part Name
    1            15    engine A
    1            17    engine C
           .
           .
           .
    125         10     Wheel A
    125         12     Wheel D
    125         13     Glass F

事情是没有什么可以加入的。

我知道我能做到:

select PartsPerCar(carid)
from Cars 

但它并没有帮助我,因为我需要partid来使用WHERE语句。通过这种方式,我无法做到这一点。

1 个答案:

答案 0 :(得分:0)

您的表使用public class SettingsActivity extends PreferenceActivity { ImageButton[] level = new ImageButton[9]; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_settings); PreferenceManager.getDefaultSharedPreferences(this).edit().clear().commit(); PreferenceManager.setDefaultValues(this, R.xml.preferences, true); level[0] = (ImageButton) findViewById(R.id.imageButton); level[1] = (ImageButton) findViewById(R.id.imageButton2); level[2] = (ImageButton) findViewById(R.id.imageButton3); level[3] = (ImageButton) findViewById(R.id.imageButton4); level[4] = (ImageButton) findViewById(R.id.imageButton5); level[5] = (ImageButton) findViewById(R.id.imageButton6); level[6] = (ImageButton) findViewById(R.id.imageButton7); level[7] = (ImageButton) findViewById(R.id.imageButton8); level[8] = (ImageButton) findViewById(R.id.imageButton9); PopulateButtons(); } public void PopulateButtons(){ SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); for (int i = 0; i < 9; i++) { String prefKey = String.format("lev%s", i); System.out.println(prefKey); if (preferences.getBoolean(prefKey, false) == true) { level[i].setBackgroundResource(R.mipmap.settings_verbs); level[i].setOnClickListener(mySettingsHandler); } else { level[i].setBackgroundResource(R.mipmap.ic_launcher); level[i].setOnClickListener(mySettingsHandler); } } } View.OnClickListener mySettingsHandler = new View.OnClickListener() { public void onClick(View v) { Context context = getApplicationContext(); SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); System.out.println("Running populate method"); for (int i = 0; i < 9; i++) { if (v.getId() == level[i].getId()) { String prefKey = String.format("lev%s", i); if (preferences.getBoolean(prefKey, false) == false) { System.out.println("Yep"); SharedPreferences.Editor editor = preferences.edit(); editor.putBoolean(prefKey, true); editor.commit(); level[i].setBackgroundResource(R.mipmap.settings_verbs); } else { System.out.println("nope"); SharedPreferences.Editor editor = preferences.edit(); editor.putBoolean(prefKey, false); editor.commit(); level[i].setBackgroundResource(R.mipmap.ic_launcher); } } } } }; } 值从函数carid中检索相应的part_id,该函数返回一组行,即所谓的table function。在第5小节(继续阅读)中,我们看到了

  

FROM中出现的表函数也可以在关键字之后   LATERAL,但对于功能,关键词是可选的;功能   参数可以包含对前面FROM提供的列的引用   无论如何都是项目。

您拥有执行查询所需的一切:

PartsPerCar()

这会在表SELECT carid, partid, part_name FROM cars, PartsPerCar(carid) AS carparts; 和函数CROSS JOIN之间创建一个cars,但由于后者的输出受到前者的参数约束,因此它有效就像一个连接条件。